c++ - 配置文件花费的时间

标签 c++ profiler valgrind callgrind

我正在寻找一些工具来分析时间花在了哪里。看过 oprofile,但这并不能真正满足我的需求。

我正在查看 callgrind,特别是使用 CALLGRIND_START_INSTRUMENTATION 和 CALLGRIND_STOP_INSTRUMENTATION 宏。我不希望该工具像 valgrind 通常那样降低应用程序的速度太多。但这并没有真正起作用,因为 Valgrind 似乎将所有内容序列化到一个线程。

例如,如果 fn A 调用 fb B,fb B 调用 fn C,然后返回到 B 和 A,我想知道在何处花费了多少时间。我有一些我正在使用的互斥工具,但是一个好的时间工具对于查看究竟在哪里花费了时间非常有用,这样我就可以专注于那些路径。除了自己添加一些东西之外,有什么工具可以用来完成这项任务吗?顺便说一句,它是一个 C++ 应用程序。我不能使用 valgrind,因为它在内核中是单线程的。此外,我的应用程序需要花费大量时间等待,因此普通的 CPU 分析器并没有真正起到多大作用。

最佳答案

您可能想看看 this post 的第 3 点.

它建议不要问时间花在了哪里,而是问为什么

假设您正在寻找某种“花费太多时间”的方法与询问(通过研究堆栈样本,而不是总结它们)程序在一小段时间内实际试图完成什么之间存在质的区别点数。

这种方法可以找到您可以通过测量方法找到的任何东西,甚至更多。 如果重复应用,它会导致很大的加速因素。

在多线程的情况下,您可以识别出不空闲的线程,并将其应用于它们。

关于c++ - 配置文件花费的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068591/

相关文章:

c++ - 尝试链接 .cpp 文件时出现多重定义错误(头文件中没有 .cpp)

c++ - `memory_resource` 的用途和用途是什么?

linux - Perf 输出奇怪的内存地址

Java动态列出分配的对象

c - 在 C 中用 fgets 逐行读取文件,大小读取无效

c++ - 无法理解如何制作 istream 操纵器

c++ - 为什么这段代码不能在 Visual Studio 2010 中编译和运行?

c# - 为什么内存使用部分在性能分析器中被禁用?

c++ - Valgrind 无法识别的指令

linux - Valgrind 不适用于 WSL?