在以下代码中,如何衡量function1()
和function3()
的总耗用时间?
在实际情况中,function1()
和function3()
分散在复杂的程序中。我需要一些可以使用函数名称来启动和停止timer
的东西,所以最后我可以打印出每个函数总共需要多长时间。
请注意,function1()
的时间不是所需的值。 <{1>}的总时间被多次调用,这是所需的值。
function1()
答案 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)进行统计采样,因此您将获得准确的计数,但仅估计花费的时间。