在Java中使用nanotime比较方法加快性能

在Java中使用nanotime比较方法加快性能,java,for-loop,while-loop,nanotime,Java,For Loop,While Loop,Nanotime,我想比较两个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 = S

我想比较两个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));
}

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

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

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

此测试是否证明readDataMethod2比以前的方法快

你在正确的轨道上,你正在衡量比较绩效,而不是做出假设

然而,在用Java编写微基准测试时,有许多潜在的问题需要注意。我建议你读一读

此测试是否证明readDataMethod2比以前的方法快

你在正确的轨道上,你正在衡量比较绩效,而不是做出假设

然而,在用Java编写微基准测试时,有许多潜在的问题需要注意。我建议你读一读

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

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

此测试是否证明readDataMethod2比以前的方法快

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

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

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

此测试是否证明readDataMethod2比以前的方法快

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

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

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


感谢您指出在Java中进行微基准标记时存在潜在的陷阱,太多程序员完全忽略了这一点;我一直认为他们的结果是准确的。感谢您指出,在Java中进行微基准标记时存在潜在的陷阱,太多的程序员完全忽略了这一点;一直认为他们的结果是准确的。
   Run         readDataMethod1    readDataMethod2

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