有没有什么方法可以知道在java中执行循环需要多少秒?执行循环需要多长时间?
例如:
for(int i=0; i < 1000000; i++) {
//Do some difficult task goes in here
}
它不必是准确的100%,但它只是有可能需要多久的想法。里面的算法是写入.txt文件的某种密钥生成器。我期望它甚至需要几分钟,所以对于我的第一次测试,我想计算秒数。
有没有什么方法可以知道在java中执行循环需要多少秒?执行循环需要多长时间?
例如:
for(int i=0; i < 1000000; i++) {
//Do some difficult task goes in here
}
它不必是准确的100%,但它只是有可能需要多久的想法。里面的算法是写入.txt文件的某种密钥生成器。我期望它甚至需要几分钟,所以对于我的第一次测试,我想计算秒数。
在这里,您可以试试这个:
long startTime = System.currentTimeMillis();
long endTime = 0;
for(int i=0; i < 1000000; i++) {
//Something
}
endTime = System.currentTimeMillis();
long timeneeded = ((startTime - endTime) /1000);
@Michael Parker:尝试'System.nanoTime();' – 2011-06-05 15:24:17
请注意,这种过分简单的方法会给出误导性的答案。 – 2011-06-05 15:26:00
为什么给0分配'endTime'? – 2011-06-05 15:59:47
这取决于循环内的操作,所以你应该做的是记录循环的开始时间和循环的结束时间,然后计算差异。你会得到循环完成的时间。例如: -
long st = System.currentTimeMillis();
for(int i=0; i < 1000000; i++) {
// --- loop operation
}
System.out.print("time to execute loop"+
((st - System.currentTimeMillis()) /1000));
请注意,这种过分简单的方法可能会导致误导性答案。 – 2011-06-05 15:26:06
除非时间倒退(当您调整时钟时可能发生),您的时间将全部为负数。 – 2011-06-05 18:46:43
你用Java编写微基准测试时需要非常小心。例如:
如果JIT编译器能够发现循环体不影响代码的结果,它可以优化它。例如:
for (int i = 0; i < 1000000; i++) {
int j = i + 1;
}
很可能“跑”得非常快。
代码在JIT编译后运行得更快。
代码可以出现运行速度变慢了很多而它正在JIT编译。
如果代码分配对象,则需要考虑GC运行导致的测量性能的潜在可变性,初始堆栈大小或最大堆大小等。
当然,性能取决于您的硬件,操作系统,JVM的版本和补丁级别以及JVM启动选项。
+1:当你有一个长循环并没有做任何事情时,你实际上计时需要多长时间才能确定循环没有做任何事情。 ;) – 2011-06-05 18:45:33
定时操作的一种方法是使用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微秒。
这完全取决于所用机器的种类。您需要对其进行基准测试。 – 2011-06-05 15:05:33
将代码添加到基准测试中会为您的循环添加额外的步骤,从而使您的基准测试不准确。 – 2017-06-27 18:14:09