c - 在 C 中分析运行时

标签 c profiling

我正在尝试找出一种方法,当我的工具运行时,我可以用这种方法写出选定数量的函数的运行时间。让我从我的工具需要的大量函数中说出各个调用 y()、z()、a1() ....

X(){

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

我不想使用 gprof,因为它需要单独运行,而且客户无法在那里运行 gprof。在许多情况下,我无法访问运行时间较长的测试。一种记录高级函数运行时间的方法会很有帮助。我不想围绕 time() 系统调用环绕每个函数调用然后打印它。宏可以帮助解决这个问题吗?有什么想法吗?

最佳答案

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

#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)

关于c - 在 C 中分析运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251689/

相关文章:

c - 是否有用于 C (gcc) 的分析器来单独分析代码行?

profiling - 什么基于示例的 FreeBSD 分析工具?

c# - C# 与 C 函数互操作的性能损失

javascript - 我可以在单页应用程序中使用浏览器 Navigation Timing API 来处理 Ajax 事件吗?如果不是,什么是好的工具?

c# - 在不访问 SQL Server Profiler 的情况下分析 ADO.NET 语句

c++ - 在 Windows 上以编程方式解压缩 AES 加密的 zip 文件

无法访问内存-gdb

c - typedef 结构错误。 '*' token 之前

c - C 同义词库程序中的插入函数无法正常工作

haskell - 如何强制 ghc 的分析器更深入地了解库?