【发布时间】:2016-07-26 06:42:09
【问题描述】:
我设计了一个程序,旨在测量时间消耗,同时避免 System.currentTimeMillis() 微小执行的阈值(可能需要不到 1 毫秒)(对于额外的操作,它不可避免地会产生可接受的不准确性),但 count 原来是222 run() 方法中的任何语句是(仅限于基本算法)。我想不出任何可能的解释,听起来不可思议,但可能是执行的下限?
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;
}
【问题讨论】:
-
如果你在方法中放很多操作(比如一个Thread.sleep),我相信你可以得到小于222。
-
您可以使用 System.nanoTime 进行更高精度的测量。
-
这很奇怪,我多次运行您的代码,收到的计数从 2,000 到 700,000 不等。
-
这在您尝试做的事情上是不可预测的、可靠的或有效的。
-
可能是因为像您在示例中编写的那样简单的东西是在编译时评估的(因为它只使用常量值)和/或完全消除(因为您没有对计算结果)。
标签: java operating-system cpu java-bytecode-asm