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

Posted

技术标签:

【中文标题】如何以可靠的方式测量执行一段代码所花费的时间?【英文标题】:How to measure the time taken by executing a piece of code in a reliable way? 【发布时间】:2012-12-23 20:08:08 【问题描述】:

关于如何测量执行时间的问题已经在 SO 上被问过很多次了,例如参见 here 或 here。然而,这些问题主要集中在使用哪些计时函数。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

如果你真的要进行高清计时,你也可以尝试使用操作系统提供的功能进入实时或高优先级CPU模式。

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

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

【讨论】:

【参考方案2】:

请检查它在 Java 中可能有用的代码

package com.test.***;

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

    


【讨论】:

以上是关于如何以可靠的方式测量执行一段代码所花费的时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何测量在 Maya、Creo Parametric、Adobe Premier 等应用程序中执行任何类型的操作所花费的时间

获取一段代码执行花费的时长

测量运行时python中每行花费的时间

测一段代码的运行时间

测量程序启动时动态链接所花费的时间?

有没有办法从属性测量 C# 函数执行时间?