【问题标题】:Timing a function in a C++ program that runs on Linux在 Linux 上运行的 C++ 程序中为函数计时
【发布时间】:2011-02-19 20:46:55
【问题描述】:

我正在尝试使用在用户空间中执行所需的时间来计时我的 C++ 程序的功能。我从程序内部尝试了 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start) 命令,但我担心这是 CPU 时间,而不是我实际需要的用户时间。在这种情况下,时间“程序名称”将不起作用,因为我只是在计时一个函数。任何帮助都会很棒。 谢谢!

【问题讨论】:

  • 您是否考虑过使用像gprof 这样的分析器?
  • 什么是gprof,如何使用?

标签: c++ linux timing


【解决方案1】:

使用times()函数,见:http://linux.die.net/man/2/times

这将为您的进程提供当前用户和系统时间。您可以在进入和退出子程序时调用它,然后减去。

您也可以使用像 gprof 这样的分析器,它会自动为您完成这一切(但会产生开销)。

【讨论】:

  • +1: times 似乎是完美的解决方案。 gprof 的开销不是 IMO 很少而且检测代码对于缓存问题的行为可能完全不同。特别是对于快速代码 IMO,获得合理数字的唯一方法是被动统计分析器。
  • 当我使用 times() 并获取用户时间时,我得到的值为 0。这是否意味着我的函数运行速度太快而无法为函数计时?
  • 可能是这样。 times() 返回“时钟滴答”的计数,您必须调用 sysconf(_SC_CLK_TCK) 来确定系统上的滴答周期。请参阅时代手册页。
【解决方案2】:

您可以使用 gettimeofday(),例如 here

将此函数添加到您的代码中:

#include <sys/time.h> 

long myclock()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (tv.tv_sec * 1000000) + tv.tv_usec;
}

并用它来检索时间:

long start = myclock();

// do something
// ...

long end = myclock() - start;

std::cout << "[" << time->tm_hour << ":"<< time->tm_min << ":" << time->tm_sec << 
             "] time:" << std::setprecision(3) << end/1000000.0 << std::endl;

【讨论】:

  • 这不是测量挂钟时间而不是用户空间 CPU 时间吗?您的方法是我通常使用的方法,但与似乎要问的问题略有不同。也不清楚所需的结果是“只有这个函数”还是“这个函数和它调用的那些”。
  • 在运行数百个进程的系统上,主要问题是您无法知道自己是否被换出。所以这种方法只有在你的函数非常快并且你的进程在计时你的函数时不会被另一个交换时才真正起作用。
【解决方案3】:

试试 boost:timer 库。它便携且易于使用。 Boost 计时器分别为您提供挂钟时间、用户时间和系统时间。

http://www.boost.org/doc/libs/1_53_0/libs/timer/doc/cpu_timers.html

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多