如何以可靠的方式测量执行一段代码所花费的时间?

时间:2012-12-23 20:08:08

标签: language-agnostic benchmarking time-measurement

关于如何衡量执行时间的问题在SO上被多次询问,例如herehere。然而,这些问题主要集中在使用哪些时序功能上。

我感兴趣的是如何使结果可重复。例如,由于多任务处理,测试代码的执行可能会被影响结果的某些后台进程中断。为了克服这个问题,我已经看到一些基准测试可以进行多次运行并花费最佳时间(除了在循环中多次运行代码)。

关于如何使结果更可靠和可重复,是否有任何其他建议或想法?

2 个答案:

答案 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);

    }

}