2012-05-23 23 views
0

我想比较两个readDataMethod()中的速度性能(如果有的话),如下所示。比较方法使用Java中的nanotime加速性能

private void readDataMethod1(List<Integer> numbers) { 
    final long startTime = System.nanoTime(); 
    for (int i = 0; i < numbers.size(); i++) { 
     numbers.get(i); 
    } 
    final long endTime = System.nanoTime(); 
    System.out.println("method 1 : " + (endTime - startTime)); 
} 

private void readDataMethod2(List<Integer> numbers) { 
    final long startTime = System.nanoTime(); 
    int i = numbers.size(); 
    while (i-- > 0) { 
     numbers.get(i); 
    } 
    final long endTime = System.nanoTime(); 
    System.out.println("method 2 : " + (endTime - startTime)); 
} 

大多数的结果我得到表明,方法2具有“低”值的时间。

Run   readDataMethod1 readDataMethod2 

    1     636331    468876 
    2     638256    479269 
    3     637485    515455 
    4     716786    420756 

此测试是否证明readDataMethod2比早期的更快?

回答

2

此测试是否证明readDataMethod2比早期的更快?

你在正确的轨道上,你是测量比较性能,而不是进行假设。

但是,在Java中编写微型基准测试时需要注意许多潜在的问题。我建议您阅读 How do I write a correct micro-benchmark in Java?

+0

感谢您指出Java中的微基准测试存在潜在的缺陷,太多程序员完全忽略了这一点;一直认为他们的结果是准确的。 –

2

在第一个中,您为每次迭代调用numbers.size()。 尝试将其存储在一个变量中,然后再次检查。

0

第二个版本运行速度更快的原因是因为您在每次迭代时都调用numbers.size()。通过存储在一个数字代替它会使它几乎与第一个相同。

0

该测试是否证明readDataMethod2比前一个更快?

正如@aix所说,你走在正确的轨道上。但是,您的方法存在一些具体问题:

  • 看起来您并不像“热身”JVM。因此可以想象,您的数字可能会因启动效应(JIT编译)而失真,或者没有任何代码被JIT编译。

  • 我也认为你的跑步做得太少了。 A 500000纳秒,是0.0005秒,这并不是很多工作。风险在于应用程序外部的“其他事物”可能会将噪声引入测量中。我会对运行花费数十秒的时间有更多的信心。