关于如何衡量执行时间的问题在SO上被多次询问,例如here或here。然而,这些问题主要集中在使用哪些时序功能上。
我感兴趣的是如何使结果可重复。例如,由于多任务处理,测试代码的执行可能会被影响结果的某些后台进程中断。为了克服这个问题,我已经看到一些基准测试可以进行多次运行并花费最佳时间(除了在循环中多次运行代码)。
关于如何使结果更可靠和可重复,是否有任何其他建议或想法?
答案 0 :(得分:1)
首先,您可能希望将要加速测试的代码与对不希望测试的代码的调用分开。特别要确保这些代码不会执行文件IO,显示输出,日志记录,控制台输出等。(当然,除非您自己测试IO代码)
您还可以提前加载进行测试运行所需的所有数据,以便不测量数据加载。
好的诀窍是尽可能少地进行测试。如果你可以追踪那几个最重要的行,那么你可以找到一种方法来与其余的代码分开测试它们。甚至可能将它们复制/粘贴到专为此目的而设计的新功能中。
如果你真的准备进行高清时间计数,你也可以尝试使用操作系统提供的功能进入实时或高优先级的CPU模式。
在某些情况下,您可能希望查看生成的低级机器代码,然后使用CPU制造商(或VM实施)的参考数据来计算相关代码将采用的“cpu-ticks”数量。由于许多cpu / vm指令具有可变的执行时间,具体取决于管道/操作数/ cpu模型/等,即使这种方法也会提供近似值。
因此,最好的建议是正确设置测量的误差范围。通常,当我开始对一些代码进行时间测试时,我个人认为这个10%。那么这个值可以(通常)减少。但它绝不是0%。因此,当您的程序输出“执行时间:%i ns”时,您可以(并且可能应该)始终打印“+ - X ns”。
答案 1 :(得分:0)
请检查它在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);
}
}