功能执行时间

时间:2014-01-11 09:16:18

标签: c++ linux profiling

我想找出在Linux上用C ++编写的函数的执行时间。我找到了很多相关的帖子。我尝试了此链接Timer Methods中提到的所有方法来计算时间。以下是我的函数执行时间的结果:

time() :           0 seconds 
clock() :          0.01 seconds
gettimeofday() :   0.002869 seconds
rdtsc() :          0.00262336 seconds
clock_gettime() :  0.00672151 seconds
chrono :           0.002841 seconds 

请帮助我在读数中哪种方法可靠,因为所有结果的读数都不同。我读到你的操作系统在不同的任务之间切换,因此读数不能非常准确。有没有办法可以计算CPU花在我的功能上的时间。我听说过使用性能分析工具,但还没有找到任何一个函数的例子。请指导我。

2 个答案:

答案 0 :(得分:2)

阅读time(7)

由于各种原因(并且取决于您的实际硬件,即您的主板),时间并不像您希望的那样准确。

因此,添加一些循环重复您的函数多次,或更改其输入以使其运行更长时间。确保整个程序的执行时间(由time(1) ...给出)至少约为一秒钟(如果可能,确保您至少有半秒的 CPU 时间)。

对于分析,编译并与g++ -Wall -pg -O1链接,然后使用gprof(1)(有更复杂的方式进行分析,例如oprofile ...)。

另请参阅this answer与非常相似的question(同一Zara)。

答案 1 :(得分:2)

如果您正在进行简单的测试,试图找出哪个实现更好,那么任何方法都可以。例如:

const int MAX = 10000;             // times to execute the function

void benchmark0() {
    auto begin = std::chrono::steady_clock::now();

    for (int i = 0; i < MAX; ++i)
        method0();

    auto now = std::chrono::steady_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - begin);
    std::cout << "Cost of method0() is " << elapsed .count() << " milliseconds" << std::endl;
}

void benchmark1() { /* almost the same as benchmark0, but calls method1 */ }

int main() {

    benchmark0();
    benchmark0();

    benchmark1();
    benchmark1();

}

您可能已经注意到benchmark0benchmark1已被连续两次调用:因为会有CPU缓存,I / O ......,您可能想要摆脱性能增益/由于缓存而丢失,但衡量的是纯粹的执行时间。

当然,您也可以使用g ++来分析程序。