执行循环需要多长时间?

时间:2011-06-05 15:03:42

标签: java

有没有办法知道在java中执行循环需要多少秒?

例如:

for(int i=0; i < 1000000; i++) {

//Do some difficult task goes in here

}

它不必是100%准确,但它只是想知道它可能需要多长时间。里面的算法是某种写入.txt文件的密钥生成器。我希望它只需要几分钟,所以对于我的第一次测试,我想计算秒数。

6 个答案:

答案 0 :(得分:13)

在Java中编写微基准时,您需要非常小心。例如:

  • 如果JIT编译器可以确定循环体不会影响代码的结果,它可以将其优化掉。例如:

    for (int i = 0; i < 1000000; i++) {
       int j = i + 1;
    }
    

    可能会非常快地“跑”。

  • 代码在JIT编译后运行得更快。

  • 代码可以出现以便在正在进行JIT编译时运行速度慢很多

  • 如果代码分配了对象,那么您需要考虑由于GC运行导致的测量性能的潜在可变性,初始或最大堆大小太小等等。

当然,性能取决于您的硬件,操作系统,JVM的版本和补丁级别以及JVM启动选项。

答案 1 :(得分:10)

在这里你可以试试这个:

long startTime = System.currentTimeMillis();
long endTime = 0;

    for(int i=0; i < 1000000; i++) {

    //Something

    }

endTime = System.currentTimeMillis();

long timeneeded =  ((startTime - endTime) /1000);

答案 2 :(得分:3)

计时操作的一种方法是使用nanoTime()获取平均值。您可能希望调整迭代次数,并且平均值会减少变化。 nanoTime比currentTimeMillis更好,因为它更准确,单调递增(在应用程序运行时不会倒退)

long start = System.nanoTime();
int runs = 1000*1000;
for(int i=0;i<runs;i++) {
   // do test
}
long time = System.nanoTime() - start;
System.out.printf("The average time taken was %.1f ns%n", (double) time / runs);

使用printf可以格式化结果。您可以除以1000得到微秒或1000000微秒。

答案 3 :(得分:2)

这取决于循环内部的操作,所以你应该做的是记录循环的开始时间和循环的结束时间,然后计算差异。您将获得完成循环所需的时间。示例: -

long st = System.currentTimeMillis();

for(int i=0; i < 1000000; i++) {
    // --- loop operation
}

System.out.print("time to execute loop"+
                     ((st - System.currentTimeMillis()) /1000));

答案 4 :(得分:0)

此Java代码段将对您非常有帮助。 它是上述答案的修改版本

long startTime = System.currentTimeMillis ();
    long startTime_2 = System.nanoTime ();
    long endTime = 0;
    int k = 0;

    for (int i = 0; i < 387420489; i++)
      {
      }

    endTime = System.currentTimeMillis ();
    long endTime_2 = System.nanoTime ();

    long timeneeded = (-1) * (startTime - endTime);
    long timeneeded_2 = (-1) * (startTime_2 - endTime_2);
    System.out.println (timeneeded + " in milliseconds " + timeneeded_2+" time in nanoseconds " );

答案 5 :(得分:-1)

将迭代次数除以10 ^ 8,您将获得毫秒级的答案