我设计了一个程序,旨在测量时间消耗,同时避免 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/