2011-06-05 116 views
6

有没有什么方法可以知道在java中执行循环需要多少秒?执行循环需要多长时间?

例如:

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

//Do some difficult task goes in here 

} 

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

+0

这完全取决于所用机器的种类。您需要对其进行基准测试。 – 2011-06-05 15:05:33

+0

将代码添加到基准测试中会为您的循环添加额外的步骤,从而使您的基准测试不准确。 – 2017-06-27 18:14:09

回答

8

在这里,您可以试试这个:

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

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

    //Something 

    } 

endTime = System.currentTimeMillis(); 

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

@Michael Parker:尝试'System.nanoTime();' – 2011-06-05 15:24:17

+0

请注意,这种过分简单的方法会给出误导性的答案。 – 2011-06-05 15:26:00

+1

为什么给0分配'endTime'? – 2011-06-05 15:59:47

1

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

long st = System.currentTimeMillis(); 

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

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

请注意,这种过分简单的方法可能会导致误导性答案。 – 2011-06-05 15:26:06

+0

除非时间倒退(当您调整时钟时可能发生),您的时间将全部为负数。 – 2011-06-05 18:46:43

11

你用Java编写微基准测试时需要非常小心。例如:

  • 如果JIT编译器能够发现循环体不影响代码的结果,它可以优化它。例如:

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

    很可能“跑”得非常快。

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

  • 代码可以出现运行速度变慢了很多它正在JIT编译。

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

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

+2

+1:当你有一个长循环并没有做任何事情时,你实际上计时需要多长时间才能确定循环没有做任何事情。 ;) – 2011-06-05 18:45:33

2

定时操作的一种方法是使用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微秒。