c ++测量重复调用的函数的时间

时间:2017-08-15 02:20:28

标签: c++

在以下代码中,如何衡量function1()function3()的总耗用时间?

在实际情况中,function1()function3()分散在复杂的程序中。我需要一些可以使用函数名称来启动和停止timer的东西,所以最后我可以打印出每个函数总共需要多长时间。

请注意,function1()的时间不是所需的值。 <{1>}的时间被多次调用,这是所需的值。

function1()

2 个答案:

答案 0 :(得分:1)

运行探查器可能是最好的方法,但如果由于某种原因无法执行此操作,则可以执行以下操作:

1)暂时将function1()的实现重命名为例如function1_implementation()(或类似的)

2)像这样编写一个新的function1()临时实现:

 static unsigned long long totalMicrosInFunction1 = 0;

 // Returns current system-clock-time, in microseconds
 static unsigned long long get_current_time_in_microseconds()
 {
    // This may not be the best way to implement this function; see below
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return ((unsigned long long)tv.tv_sec)*1000000 + tv.tv_usec;
 }

 int function1()
 {
    unsigned long long startTime = get_current_time_in_microseconds();
    int ret = function1_implementation();  // call the real code!
    unsigned long long endTime = get_current_time_in_microseconds();

    totalMicrosInFunction1 += (endTime-startTime);
    return ret;
 }

3)对你想要的任何其他功能做同样的技巧。

...然后重新编译你的程序,并在main()的末尾打印出totalMicrosInFunction1的当前值。

请注意,get_current_system_time_in_microseconds()的上述实现可能不是您用例的最佳实现;如果您正在使用C ++ 11,则可以使用std::chrono::high_resolution_clock来实现此目的;否则你可以在windows下使用特定于操作系统的API,如QueryPerformanceCounter()

答案 1 :(得分:1)

假设您在具有单个CPU模块的PC上运行,则可以使用rdtscp指令获取刻度数。累积滴答声。完成后,将滴答转换为时间,然后就完成了。

请查看链接:https://msdn.microsoft.com/en-us/library/bb385235.aspx,了解如何在Windows上执行rdtscp。

这是假设您只有一个线程而编写的。

现在,创建一个变量“unsigned __int64 totalTicks = 0;”在文件范围。

Function1将按如下方式编写:

int function1()
{
    unsigned int arg;
    unsigned __int64 startTicks = __rdtscp(&arg); // arg is not used
    int ret = function1_implementation();  // call the real code!
    unsigned __int64 endTicks = __rdtscp(&arg);
    totalTicks += (endTicks - startTicks);

    return ret;
}

tick是CPU时钟速率的倒数,因此2.5GHz CPU将在一秒钟内产生25亿个滴答。

或者,您可以创建一个Timer类来执行我描述的核心功能 - 创建start()和stop()方法以返回两个值,并使用elapsed()方法返回delta。在任何函数的开头调用start(),在结尾调用elapsed()。然后,任何需要唯一计时器的函数都可以使用不同的Timer实例。

这将在现代CPU上提供亚纳秒分辨率。如果您的功能小而快,使用单调时间答案可能无法为您提供足够的分辨率。这也是使用分析器的问题,因为它们通常以10ms的时钟速率(Linux上的gprof)进行统计采样,因此您将获得准确的计数,但仅估计花费的时间。