收集有关堆使用情况的性能数据

时间:2019-04-12 17:26:18

标签: performance analytics performance-testing

我正在开发一个编译器模块,该模块在应用程序的每个加载/存储周围添加额外的指令,重点放在堆对象上。性能因素之一是被访问对象的大小。在运行时针对不同的对象大小选择了不同的指令。

我从SPEC中选择了一些基准来对变更对性能的影响进行评分。目前,我仅限于查看以性能衡量的间接费用。这导致人们对为什么某些基准比其他基准受到更严重影响的猜测。为每个假设提供更多数据似乎是一个不错的步骤。从每个基准测试中,对于在堆上分配的每个对象,了解以下信息将很有用:

  • 每个堆分配或重新分配的大小
  • 在整个应用程序运行期间访问每个分配的次数。

我在第一名中取得了成功。将小数的printf()调用注入到glibc中已经很容易了,因为我已经开始修改glibc了。我不知道如何获得第二名。访问次数似乎更适合于框架或包装工具,但我不知道哪个最适合。

您能否提供有关如何收集此信息的建议?

2 个答案:

答案 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