我使用perf来分析我的应用程序。为了简化对生成的调用图的解释,我使用标签函数(如maptable_appendRange )划分了我的核心循环,这些函数可以很容易地在调用图中搜索。不幸的是,这些函数大多是由优化器内联的,因此没有出现在调用图中。
要解决这个问题,我可以在没有优化(-O0)的情况下进行编译,而且一切都很好,使用label函数进行分析是件好事。另一方面,优化对我的代码的总体性能有相当大的影响,我不确定不进行优化的分析是否能代表实际性能。
因此,我的问题是:在分析未优化的代码时,我能期待有代表性的结果吗?
发布于 2016-08-23 13:16:16
你得问问你为什么要做侧写。
如果答案是1,那么无论如何,在优化的代码上运行分析器。
如果答案是2,那就不要。原因如下。有两种加速方式,一种是你可以做的,另一种是编译器可以做的。
编译器无法找到或修复您可以做的加速操作,例如最小化内存分配、回传使用重复参数调用的函数、避免看似无辜的库调用,这些调用最终会执行轻松的I/O操作。
没有任何速度错误,您可以修复,这是任何更明显的优化器。
它所能做的就是通过置乱代码、随机内联、删除堆栈帧等方式,使它们更难找到。
请记住,它唯一能做的改进是在调用堆栈的底部,并且只有在代码中。它在堆栈上所做的任何事情都是极小/微不足道的好处。
有些人使用的策略是这,而其工作的统计原因是这里。在没有优化器的情况下,完成了足够的操作,使代码快速运行,然后打开优化器,使其更快。
发布于 2016-08-23 12:06:22
如果希望分析结果有意义,则应该使用使用您打算在生产中使用的优化标志。
也就是说,您可以告诉大多数编译器永远不要内联特定的函数。例如,如果您使用gcc,您可以使用__attribute__((noinline))标记您的标签函数:
__attribute__((noinline)) int func()
{
...
}(其他编译器通常提供类似的扩展。)这应该允许标签函数在配置文件中显示,即使在启用优化时也是如此。请记住,该属性是gcc特有的,因此,一旦完成分析,就将其删除,或者将其包装在一个宏中,如果使用了不同的编译器,则该宏的值为零。
当然,如果这些特定功能的内联实际上对性能有重大影响,那么分析结果可能仍然不具有充分的代表性。
https://softwareengineering.stackexchange.com/questions/329112
复制相似问题