【问题标题】:Time-based profiling using Clang instrumentation使用 Clang 检测的基于时间的分析
【发布时间】:2018-01-15 16:28:34
【问题描述】:

Clang 的-fprofile-instr-generate 选项可以记录每行代码(甚至是部分代码)被执行的次数。有一些开销,但非常少。

有没有办法让 Clang 做类似的事情,但记录一行代码的总执行时间,而不是它的运行次数。

我知道有基于样本的分析器(性能等),但这些似乎很糟糕 - 例如据我所知,他们对调用堆栈进行采样,因此您不会获得行级信息。

只要不会过多地扭曲相对时序(+/-30% 即可),我可以接受很大的开销(例如 100%)。

【问题讨论】:

  • 以纳秒分辨率记录每一行的时间对我来说听起来像是更多的开销。单独的寄存器溢出可能会给你 10 倍,日志记录可能会把它带到 1000 倍。
  • 我认为您可以使用应该相当快的性能计数器来做一些事情。无论如何,我对代码中的大量开销感到满意 - 我希望大部分时间都花在我正在使用的库中(例如标准库)。
  • 你可以使用rdtsc,它使用两个32位寄存器(-fprofile-instr-generate使用一个),并且是一条指令。应该非常快。没有准确测量时间,但我很高兴禁用时钟缩放等。
  • ...嗯,从概念上讲,虽然您总是可以计算行(=完整表达式)在逻辑上执行的次数,但您甚至可以定义执行它所需的时间?例如。完整的表达式指令可以根据优化器的效果在 as-if 规则下交错和混合;如果检测代码抑制了优化器,您可能会严重高估结果(例如自动矢量化线),如果没有得到可能毫无意义的结果......或者我错过了什么?
  • 确实如此,但由于禁用乱序执行等原因,结果有些失真,我对此感到满意。我知道完美的结果是不可能的。

标签: c++ clang


【解决方案1】:

似乎确实有这样的东西 - 它被称为 XRay 并且是由 by Google 开发的。

据我所知,它没有达到逐行分析,甚至没有达到基本块级别。粒度仅限于函数 - 但您可以准确控制检测哪些函数(默认情况下,那些具有超过 100 条指令的函数),甚至可以在运行时打开和关闭检测。

它似乎处于相当早期的开发阶段,仅适用于 Linux。看起来还是很有用的。

编辑gperftools 实际上在这方面工作得很好(我想我之前解雇了他们,因为 pprof 以前根本不能在 Mac 上工作,但我已经解决了这个问题)。我强烈建议您使用pprof-http 选项 - 它为您提供了一个很酷的交互界面,包含源代码、调用图、火焰图等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2022-11-18
    • 2011-06-02
    • 2016-05-28
    相关资源
    最近更新 更多