微基准测试microbenchmarks,微小代码单元的测试。但是要注意两个计时之间的代码是否被使用过,如下面的代码
public void doTest() {
// Main Loop
double l;
long then = System.currentTimeMillis();
11
www.it-ebooks.infofor (int i = 0; i < nLoops; i++) {
l = fibImpl1(50);
}
long now = System.currentTimeMillis();
System.out.println("Elapsed time: " + (now - then));
}
...
private double fibImpl1(int n) {
if (n < 0) throw new IllegalArgumentException("Must be > 0");
if (n == 0) return 0d;
if (n == 1) return 1d;
double d = fibImpl1(n - 2) + fibImpl(n - 1);
if (Double.isInfinite(d)) throw new ArithmeticException("Overflow");
return d;
}
由于斐波那契的结果没被使用,智能编译器会优化成如下代码
long then = System.currentTimeMillis();
long now = System.currentTimeMillis();
System.out.println("Elapsed time: " + (now - then));
那么会得到错误的结果为几毫秒。
解决办法是---把l提升为实例变量,并且标记为volatile(强制每次写以后有一次的同步刷新---实际使用了cpu栅栏)
即确保读取被测试的结果,而不是i简单的写入
+不要包括无关的操作