我正在开发一个编译器模块,该模块在应用程序的每个加载/存储周围添加额外的指令,重点放在堆对象上。性能因素之一是被访问对象的大小。在运行时针对不同的对象大小选择了不同的指令。
我从SPEC中选择了一些基准来对变更对性能的影响进行评分。目前,我仅限于查看以性能衡量的间接费用。这导致人们对为什么某些基准比其他基准受到更严重影响的猜测。为每个假设提供更多数据似乎是一个不错的步骤。从每个基准测试中,对于在堆上分配的每个对象,了解以下信息将很有用:
我在第一名中取得了成功。将小数的printf()调用注入到glibc中已经很容易了,因为我已经开始修改glibc了。我不知道如何获得第二名。访问次数似乎更适合于框架或包装工具,但我不知道哪个最适合。
您能否提供有关如何收集此信息的建议?
答案 0 :(得分:0)
如果要在组装中进行检测(我想是吗?),则可以在数据段中仅粘贴带有值的标签:
.data
# probably some other stuff goes here
.align 4
count:
.long 0
并像这样递增它:
movl count, %eax
addl $1, %eax
movl %eax, count
选择适当的寄存器。尽管我想如果您是在函数调用的开头执行此操作的,则%eax
仍然会遭到破坏。
答案 1 :(得分:0)
Valgrind有一个工具'DHAT'-动态堆分析工具-可以收集此数据。输出的格式不完全是我想要的格式,但它足够接近研究工作。访问次数总结为“平均” [读取/写入]每字节每分配”;确切的访问计数没有报告,也无法从其他报告数据中恢复。也许我将来会进行一些开源开发?
http://valgrind.org/docs/manual/dh-manual.html
valgrind --tool=exp-dhat --show-top-n=100000 --trace-children=yes --log-file="log.file" ./benchmark