我想测量 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插件?
答案 0 :(得分:0)
perf record
会将事件累积到指令中。但这并不准确:获取事件计数的指令并不总是那些本身很慢的指令,就在附近,例如等待缓慢的事情发生。但足够接近可能有用。
看起来您需要的只是查看每个insn或每行C的计数(通过调试信息进行映射)并查看相对计数何时发生变化。
这应该可以确定何时更改使asm的某个部分运行得更慢:与源事件相关联的insn的perf事件计数的相对份额将更高。 (+/-大量挥手,因为C行并不总是直接映射到asm指令,尤其是当优化重构某些分支逻辑,自动矢量化等时)。
有可能制定一个自动化测试程序,在perf record
下运行您的代码,然后将perf report
数据按摩成某种格式,在比较源版本时可以进行比较/跟踪。