java - Java有执行时间下限吗?

标签 java operating-system cpu java-bytecode-asm

我设计了一个程序,旨在测量时间消耗,同时避免 System.currentTimeMillis() 执行微小执行的阈值(可能需要不到 1 毫秒)(这将不可避免地产生额外操作的可接受的不准确度),但无论 run() 方法中的语句是什么(仅限于基本算法),count 结果都是 222。我无法找出任何可能的解释,听起来令人难以置信,但也许是执行的下限?

public static void main(String[] args) throws Exception{
     long result=TinyTimer(new Runnable(){
        @Override
        public void run(){
            double d=190283758/287365628;
        }
     });
     System.out.println(result);
}

public static long TinyTimer(Runnable r){
    long count=0;
    long origin=System.currentTimeMillis();
    while(System.currentTimeMillis()==origin){
        r.run();
        count++;
    }
    return count;
}

最佳答案

您应该注意

  • 在某些较旧的 Windows 系统上,System.currentTimeMillis() 的分辨率为 16 毫秒,而不是 1 毫秒。
  • 未预热的代码的性能作为练习很有趣,但与生产系统很少相关。我建议您至少忽略热身的前 2 秒。
  • 不执行任何操作的代码可以使用死代码消除来消除。在这种情况下,您应该期望代码被消除,并且预热后的所有计时都是调用 System.currentTimeMillis() 所需的时间,该时间应该在 25 - 50 纳秒之间,具体取决于您的CPU。

我建议你看看使用JMH (Java Microbenchamrk Harness)旨在处理编写微基准测试中的大多数常见错误。

but the count turns out to be 222 whatever statements inside the run() method are(limited to basic algorithms)

很可能时间花在运行解释器来执行此代码上,并且开销如此之高,您选择的操作没有太大区别。

关于java - Java有执行时间下限吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36441357/

相关文章:

java - maxUploadsize 和 maxInMemorySize 之间的区别

php - 标签 "Filesystem"上的问题

operating-system - 在 Fortran 中获取文件分隔符

c - 使用两个循环体还是一个(结果相同)?

caching - 缓存缓存更改会阻止崩溃吗?

java - java 军事时间 时差

java - 代码覆盖率插件在 NetBeans 7.0 中是否仍然可用?我该如何使用它?

java - 从 URL 检索 XML,不写入前几行

linux - 一旦线程被让出,操作系统会切换到偶像进程执行吗?

linux - 如何在 Linux 中获取 CPU 缓存的大小