带有注释(pragma)的仪器C代码,用于性能跟踪

时间:2016-04-14 06:09:04

标签: c performance plugins profiling pragma

我想测量 C代码中非常特定部分的时间(或出现次数)(它们可能仅限于某些函数中的一些指令)。一个目的是跟踪多个代码修订的本地性能改进或回归。

我知道我可以为此目的定义宏。但是,是否有任何工具已经以一种甚至更少侵入性的方式做到了这一点?使用注释( #pragma )将是完美的:

mat <- matrix(c(3,1,20,5,4,12,6,2,9,7,8,7), byrow=T, ncol=3) 
set.seed(24)
data <- data.frame(Pb = sample(1:9, 42, replace=TRUE), Ps = rnorm(42))

理想情况下,在运行结束时,工具将显示每个子部分的累计弹跳时间。例如:

void func_to_profile()
{
    /* Some instructions */
    ...


#pragma profile foo start
    /* A part of the code to track */
    ...
#pragma profile foo stop


    /* More instructions */
    ...


#pragma profile bar start
    /* Another part to measure */
    ...
#pragma profile bar stop
}

有没有现有的工具已经做过,或者我别无选择,只能开发自己的 GCC插件

1 个答案:

答案 0 :(得分:0)

对于像核心时钟周期这样的事件,

perf record会将事件累积到指令中。但这并不准确:获取事件计数的指令并不总是那些本身很慢的指令,就在附近,例如等待缓慢的事情发生。但足够接近可能有用。

看起来您需要的只是查看每个insn或每行C的计数(通过调试信息进行映射)并查看相对计数何时发生变化。

这应该可以确定何时更改使asm的某个部分运行得更慢:与源事件相关联的insn的perf事件计数的相对份额将更高。 (+/-大量挥手,因为C行并不总是直接映射到asm指令,尤其是当优化重构某些分支逻辑,自动矢量化等时)。

有可能制定一个自动化测试程序,在perf record下运行您的代码,然后将perf report数据按摩成某种格式,在比较源版本时可以进行比较/跟踪。