关于如何测量执行时间的问题已经在 SO 上被问过很多次了,例如看这里或这里。然而,这些问题主要集中在使用哪些计时功能。
我感兴趣的是如何使结果可重现。例如,由于多任务处理,测试代码的执行可能会被影响结果的某些后台进程中断。为了克服这个问题,我已经看到一些基准测试进行了多次运行并花费了最好的时间(除了在循环中多次运行代码之外)。
关于如何使结果更可靠和可重复,还有其他建议或想法吗?
首先,您可能希望将要加速测试的代码与对您不想测试的代码的调用分开。尤其要确保这样的代码不会做文件 IO、显示输出、日志记录、控制台输出等。(当然,除非你测试 IO 代码本身)
您还可以提前加载进行测试运行所需的所有数据,这样就不会测量数据加载。
好的技巧是尽可能少地测试。如果您可以追踪到最有影响的那几行,那么您可以找到一种方法将它们与其余代码分开测试。甚至可能将它们复制/粘贴到专门为此目的设计的新功能中。
如果你真的打算做高清计时,你也可以尝试使用 OS 提供的功能进入实时或高优先级 CPU 模式。
在某些情况下,您可能希望查看生成的低级机器代码,然后使用来自 CPU 制造商(或 VM 实现)的参考数据来计算相关代码需要多少“cpu-ticks”。由于许多 cpu/vm 指令的执行时间取决于管道/操作数/cpu 模型/等,因此即使这种方法也将提供近似值。
因此,最好的建议是正确设置测量的误差范围。通常,当我开始对某些代码进行时间测试时,我个人会考虑这 10%。然后这个值可以(通常)减少。但它永远不会是 0%。因此,当您的程序输出“执行时间:%i ns”时,您可以(并且可能应该)始终打印“+- X ns”。
请检查它在 Java 中可能有用的代码
package com.test.stackoverflow;
public class Sample {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
for(int i=0;i<10000; ++i)
{
System.out.println("You ae executng Looop");
}
long endTime = System.currentTimeMillis();
long diffTime = endTime - startTime;
System.out.println("Start Execution at in Time (Seconds ) "+ startTime * 0.001);
System.out.println("End Execution at in Time (Seconds ) "+ endTime * 0.001);
System.out.println("Difference in Time (Seconds ) "+ diffTime * 0.001);
}
}