【发布时间】:2018-01-15 16:28:34
【问题描述】:
Clang 的-fprofile-instr-generate 选项可以记录每行代码(甚至是部分代码)被执行的次数。有一些开销,但非常少。
有没有办法让 Clang 做类似的事情,但记录一行代码的总执行时间,而不是它的运行次数。
我知道有基于样本的分析器(性能等),但这些似乎很糟糕 - 例如据我所知,他们对调用堆栈进行采样,因此您不会获得行级信息。
只要不会过多地扭曲相对时序(+/-30% 即可),我可以接受很大的开销(例如 100%)。
【问题讨论】:
-
以纳秒分辨率记录每一行的时间对我来说听起来像是更多的开销。单独的寄存器溢出可能会给你 10 倍,日志记录可能会把它带到 1000 倍。
-
我认为您可以使用应该相当快的性能计数器来做一些事情。无论如何,我对代码中的大量开销感到满意 - 我希望大部分时间都花在我正在使用的库中(例如标准库)。
-
你可以使用
rdtsc,它使用两个32位寄存器(-fprofile-instr-generate使用一个),并且是一条指令。应该非常快。没有准确测量时间,但我很高兴禁用时钟缩放等。 -
...嗯,从概念上讲,虽然您总是可以计算行(=完整表达式)在逻辑上执行的次数,但您甚至可以定义执行它所需的时间?例如。完整的表达式指令可以根据优化器的效果在 as-if 规则下交错和混合;如果检测代码抑制了优化器,您可能会严重高估结果(例如自动矢量化线),如果没有得到可能毫无意义的结果......或者我错过了什么?
-
确实如此,但由于禁用乱序执行等原因,结果有些失真,我对此感到满意。我知道完美的结果是不可能的。