C语言中的运行时分析

时间:2011-08-31 01:32:29

标签: c profiling

我试图找到一种方法,当我的工具运行时,我可以写出所选数量的函数的运行时间。让我说出我的工具所需的大量函数列表,我需要写出个别调用y(),z(),a1()......所花费的时间。

X(){

 y();
 ..
 ..
 z();
 ..
 ..
 a1();
 ..
 ..
 b1();
 ..
 ..
}

我不想使用gprof,因为它需要单独运行,并且客户无法在那里运行gprof。在许多情况下,我无法访问产生长运行时的测试。记录高级功能的运行时间的方法将是有帮助的。我不想围绕time()系统调用包围每个函数调用,然后打印它。宏可以帮忙吗?任何想法?

3 个答案:

答案 0 :(得分:2)

你说你不想包装每个调用,但是让我告诉你如何处理定时器调用,这样它们就可以在编译时被删除,也许以后可以将它包装在另一个宏中:

#ifndef NOTIME
#  include <ctime>
#  define CLOCK_TICK(acc, ctr)  ctr = std::clock()
#  define CLOCK_TOCK(acc, ctr)  acc += (std::clock() - ctr)
#  define CLOCK_RESET(acc) acc = 0
#  define CLOCK_REPORT(acc) 1000. * double(acc) / double(CLOCKS_PER_SEC)

static clock_t t1a, t1c, t2a, t2c; // as many pairs as you need

#else
#  define CLOCK_TICK(acc, ctr)
#  define CLOCK_TOCK(acc, ctr)
#  define CLOCK_RESET(acc)
#  define CLOCK_REPORT(acc) 0
#endif

现在您可以像这样使用它:

CLOCK_RESET(t1a);
for (int i = 0; i != 250000; ++i)
{
  CLOCK_TICK(t1a, t1c);
  some_expensive_function();
  CLOCK_TOCK(t1a, t1c);
}
std::cout << "Time spent in some_expensive_function(): " << CLOCK_REPORT(t1a) << "ms.\n";

使用可变参数宏,您甚至可以完成函数调用:

#define timed_call(ACC, CTR, func, ...) do { CLOCK_TICK(ACC, CTR); \
                                             func(__VA_ARGS__);    \
                                             CLOCK_TOCK(ACC,CTR);  \
                                           } while (false)

答案 1 :(得分:1)

您的客户无需运行gprof。如果您使用性能分析编译可执行文件,他只需要正常运行应用程序,然后收集gmon.out数据文件并将其交付给您。然后,您将运行gprof以生成分析数据。

如果您想要更好地控制代码的哪些部分被分析,那么您可以尝试使用开源Shiny分析器。要使用它,您需要链接到一个小型C ++库,并在要分析的每个函数的开头插入一个宏。还有用于分析代码块的选项。分析器输出是通过应用程序的函数调用生成的,因此您可以决定输出的生成方式和时间。

答案 2 :(得分:1)

为什么不用这样的宏包装每个调用:

#define WRAP(fcall) do {\
  .. before stuff .. \
  fcall; \
  .. after call .. \
  } while(0)

然后代替每个

foo(x, y, z);
你写了

WRAP(foo(x, y, z));

然后,如果你想禁用它,只需注释掉前/后的东西。

它可能不漂亮,但它确实有效。