有没有办法知道在java中执行循环需要多少秒?
例如:
for(int i=0; i < 1000000; i++) {
//Do some difficult task goes in here
}
它不必是100%准确,但它只是想知道它可能需要多长时间。里面的算法是某种写入.txt文件的密钥生成器。我希望它只需要几分钟,所以对于我的第一次测试,我想计算秒数。
答案 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,您将获得毫秒级的答案