0

我想比较两个 readDataMethod() 的速度性能(如果有的话),如下所示。

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 比之前的更快?

4

4 回答 4

3

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

于 2012-05-23T14:39:11.733 回答
3

此测试是否证明 readDataMethod2 比之前的更快?

您在衡量比较绩效而不是做出假设方面是正确的。

然而,在 Java 中编写微基准测试时,有很多潜在的问题需要注意。我建议您阅读 如何在 Java 中编写正确的微基准测试?

于 2012-05-23T14:40:01.687 回答
0

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

于 2012-05-23T14:53:27.753 回答
0

此测试是否证明 readDataMethod2 比之前的更快?

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

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

  • 我还认为你的跑步做的工作太少了。一500000纳秒,就是0.0005几秒,这没什么用。风险在于应用程序外部的“其他事物”可能会将噪声引入测量。我对需要几十秒的跑步更有信心。

于 2012-05-23T15:22:34.927 回答