3

关于如何测量执行时间的问题已经在 SO 上被问过很多次了,例如看这里这里。然而,这些问题主要集中在使用哪些计时功能。

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

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

4

2 回答 2

1

首先,您可能希望将要加速测试的代码与对您不想测试的代码的调用分开。尤其要确保这样的代码不会做文件 IO、显示输出、日志记录、控制台输出等。(当然,除非你测试 IO 代码本身)

您还可以提前加载进行测试运行所需的所有数据,这样就不会测量数据加载。

好的技巧是尽可能少地测试。如果您可以追踪到最有影响的那几行,那么您可以找到一种方法将它们与其余代码分开测试。甚至可能将它们复制/粘贴到专门为此目的设计的新功能中。

如果你真的打算做高清计时,你也可以尝试使用 OS 提供的功能进入实时或高优先级 CPU 模式。

在某些情况下,您可能希望查看生成的低级机器代码,然后使用来自 CPU 制造商(或 VM 实现)的参考数据来计算相关代码需要多少“cpu-ticks”。由于许多 cpu/vm 指令的执行时间取决于管道/操作数/cpu 模型/等,因此即使这种方法也将提供近似值。

因此,最好的建议是正确设置测量的误差范围。通常,当我开始对某些代码进行时间测试时,我个人会考虑这 10%。然后这个值可以(通常)减少。但它永远不会是 0%。因此,当您的程序输出“执行时间:%i ns”时,您可以(并且可能应该)始终打印“+- X ns”。

于 2013-02-11T05:32:02.743 回答
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);

    }

}
于 2013-01-07T13:05:37.273 回答