繁体   English   中英

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

[英]Collecting performance data on heap usage

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

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

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

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

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

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

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

并按如下方式递增:

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

选择合适的登记册。 虽然我想如果你是在函数调用的头部进行的,那么%eax无论如何都会被破坏。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM