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

问题描述 投票:0回答:2

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

我从SPEC中选择了一些基准来评估我的更改对性能的影响。目前,我仅限于查看由perf测量的间接费用。这导致大量猜测为什么某些基准比其他基准受到更严重的影响。用更多数据支持每个假设似乎是一个很好的步骤。从每个基准测试,对于在堆上分配的每个对象,知道以下内容将是有用的:

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

我在#1中取得了成功。很容易将一些printf()调用注入到glibc中,因为我已经在修改glibc了。我不知道如何获得#2;访问计数似乎更适合框架或包装工具,我不知道哪一个最适合。

您能否就如何收集这些信息提出建议?

performance analytics performance-testing
2个回答
0
投票

如果你正在组装中进行检测(我认为你是?),你可以在数据段中粘贴一个带有值的标签:

        .data
# probably some other stuff goes here
        .align 4
count:
        .long   0

并按如下方式递增:

        movl    count, %eax
        addl    $1, %eax
        movl    %eax, count

选择合适的登记册。虽然我想如果你在函数调用的头部做这件事,%eax无论如何都会受到破坏。


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

© www.soinside.com 2019 - 2024. All rights reserved.