是否有任何好的工具来分析混合了C和C ++的源代码。有什么优点和缺点,你使用过哪些,并建议使用。请不要给我一个谷歌工具列表。我也可以这样做,我想要的是利用使用这些工具的人的个人经验并了解他们的利弊。
提前谢谢。
答案 0 :(得分:32)
我发现gprof是最好的CPU热点分析器,而Google Performance Tools是最佳的采样分析器。两者都适用于C和C ++。
我认为有no good profiling tools on Windows。
答案 1 :(得分:4)
我会恭敬地不同意马特。
我在Windows上一直使用的工具是the random-pausing technique,它适用于IDE支持的所有语言。
作为使用它进行性能调整的示例,this case显示了如何通过一系列步骤实现43次加速。
Gprof有很多问题,listed here,并且根据google-perftools手册,在那里重复了一些相同的问题,例如报告程序,而不是线条,强调自我(本地)时间,强调图表等(我无法从文档中判断它是否在被阻止时进行采样。)
随着软件系统变得越来越大,自我时间变得越来越不相关。程序计数器将大部分时间用在库例程中或在系统中被阻止。 图形变成巨大的巢穴。 人们问“我知道函数X代价高昂,但函数X在哪里是问题?” 更重要的是,“瓶颈”变得越来越大,因为堆栈平均越来越深,堆栈的每一层都是一个新的机会,可以进行比必要更多的函数调用。
一个逐行报告的堆栈采样器示例,以及阻止采样,并允许用户控制采样以便在用户输入期间不稀释样本集的示例Zoom。
编辑:对不起,不能单独离开。这是一个新的解释:程序工作的方式,他们追溯到一个调用树,这很像我窗外的橡树。它有一个树干(主要),它发芽分支(呼叫站点),它发出了几个级别的更多分支到叶子(指令)和橡子(阻塞呼叫)。
当树木外科医生来修剪(优化)它时,他是否只看叶子的位置(热点)?他是否忽略了橡子(阻塞期间没有样品)? 不,他寻找的分支(呼叫站点)都很重(在堆栈上很多)和不健康(不必要)。这些都是他修剪的。 这就是随机暂停和缩放功能,可以帮助找到这些呼叫站点。
答案 2 :(得分:3)
您可以使用Callgrind创建分析输出。它是Valgrind的一部分。 Callgrind-output可以与KCacheGrind一起使用,只要您使用Linux,这可能值得一看。
答案 3 :(得分:2)
AMD CodeAnalyst非常好。它也是跨平台,当找到特定于平台的瓶颈时,这是很好的。