您可能会对 valgrind 及其工具 callgrind 感兴趣。
valgrind --trace-children=yes --tool=callgrind -v ./program
它将在文件中生成详细的调用图,其中包括每个函数中传递的时间量。
然后您可以使用 kcachegrind 查看所有这些,这是一个用于可视化数据的漂亮 UI。
kcachegrind
它将允许您查看所有调用 pthread_mutex_lock()(或其他)的函数,其中包括时间百分比最高的函数...
callgrind 最相关的部分是你可以很容易地找到单线程程序中的瓶颈,因为你只需要查看占用 cpu 时间最多的函数。
在多线程程序中,函数等待某个东西(互斥体)很长时间是正常情况,因此比较困难。
您还可以使用 valgrind 的 Helgrind 工具,它可以帮助您在使用互斥锁时发现错误(潜在的死锁或潜在的数据竞争)。
我猜它通过分析Serializability 分析您对同步函数的调用以及您读/写的数据,以检测潜在问题(可能发生超过 1000000 1 次的问题)同步和数据访问的一致性。 (我重复一遍:我猜)。
valgrind --tool=helgrind --suppressions=$PWD/supp --gen-suppressions=yes --db-attach=yes --track-lockorders=no ./program
以及valgrind的核心特性:检查内存泄漏:
valgrind --leak-check=yes -v --db-attach=yes ./program