以下代码证明method1比method2更快.任何人都可以评论这种行为的原因是什么.
class Trial { String _member; void method1() { for(int i=0;i<30480;i++) { _member += "test"; } } void method2() { String temp=""; for(int i=0;i<30480;i++) { temp += "test"; } _member = temp; } public static void main(String args[]) { Trial t = new Trial(); long startTime1 = System.currentTimeMillis(); t.method1(); long endTime1 = System.currentTimeMillis(); long startTime2 = System.currentTimeMillis(); t.method2(); long endTime2 = System.currentTimeMillis(); System.out.println(endTime1 - startTime1); System.out.println(endTime2 - startTime2); } }
解决方法
The following code proves that method1 is faster than method2
不,它不能证明这一点.
这取决于很多因素.当我运行此代码时,我得到了
1403 1248
所以在我的环境中,你的代码“证明”method1比method2慢.
在进行基准测试时,您需要注意缓存和JVM预热等效果.
也可以看看
> How do I write a correct micro-benchmark in Java?
> Avoid jvm warmup
欲获得更多信息.
我稍微重构了主要方法:
... static void doBenchmark() { Trial t = new Trial(); long startTime1 = System.currentTimeMillis(); t.method1(); long endTime1 = System.currentTimeMillis(); long startTime2 = System.currentTimeMillis(); t.method2(); long endTime2 = System.currentTimeMillis(); System.out.println(endTime1 - startTime1); System.out.println(endTime2 - startTime2); } public static void main(String args[]) { for (int i = 0; i < 20; i++) { doBenchmark(); System.out.println("----"); } }
这导致for循环的第一次迭代具有相似的值,但随后结果收敛并且不再显着不同:
1396 1133 ---- 1052 1070 ---- 688 711 ---- 728 726 ---- 715 709 ---- ...