收集有关堆使用情况的性能数据
Collecting performance data on heap usage
我正在开发一个编译器模块,该模块在强调堆对象的应用程序中围绕每个 load/store 添加额外的指令。性能因素之一是被访问对象的大小;在 运行 时间针对不同的对象大小选择不同的指令。
我从 SPEC 中选择了一些基准来评估我的更改对性能的影响。目前,我仅限于查看 perf 衡量的开销。这导致大量猜测为什么某些基准比其他基准受到更严重的影响。用更多数据支持每个假设似乎是一个很好的步骤。从每个基准测试中,对于分配在堆上的每个对象,了解以下内容将很有用:
- 每次堆分配或重新分配的大小
- 在整个 运行 应用程序中访问每个分配的次数。
我在#1 中取得了成功。将一些 printf() 调用注入 glibc 非常容易,因为我已经在 glibc 中进行修补了。我不知道如何获得#2;访问计数似乎更适合框架或包装器工具,我不知道哪一个最有效。
您能否就如何收集这些信息提供建议?
如果您在汇编中进行检测(我认为您是?),您可以在数据段中插入一个带有值的标签:
.data
# probably some other stuff goes here
.align 4
count:
.long 0
并像这样增加它:
movl count, %eax
addl , %eax
movl %eax, count
选择合适的寄存器。虽然我想如果你在函数调用的开头这样做,%eax
无论如何都会被破坏。
Valgrind 有一个工具“DHAT”——动态堆分析工具——可以收集这些数据。输出的格式不完全是我想要的格式,但对于研究工作来说已经足够接近了。访问计数总结为"average [reads|writes] per byte per allocation";确切的访问计数未报告,也无法从其他报告数据中恢复。也许我将来会进行一些开源开发?
http://valgrind.org/docs/manual/dh-manual.html
valgrind --tool=exp-dhat --show-top-n=100000 --trace-children=yes --log-file="log.file" ./benchmark
我正在开发一个编译器模块,该模块在强调堆对象的应用程序中围绕每个 load/store 添加额外的指令。性能因素之一是被访问对象的大小;在 运行 时间针对不同的对象大小选择不同的指令。
我从 SPEC 中选择了一些基准来评估我的更改对性能的影响。目前,我仅限于查看 perf 衡量的开销。这导致大量猜测为什么某些基准比其他基准受到更严重的影响。用更多数据支持每个假设似乎是一个很好的步骤。从每个基准测试中,对于分配在堆上的每个对象,了解以下内容将很有用:
- 每次堆分配或重新分配的大小
- 在整个 运行 应用程序中访问每个分配的次数。
我在#1 中取得了成功。将一些 printf() 调用注入 glibc 非常容易,因为我已经在 glibc 中进行修补了。我不知道如何获得#2;访问计数似乎更适合框架或包装器工具,我不知道哪一个最有效。
您能否就如何收集这些信息提供建议?
如果您在汇编中进行检测(我认为您是?),您可以在数据段中插入一个带有值的标签:
.data
# probably some other stuff goes here
.align 4
count:
.long 0
并像这样增加它:
movl count, %eax
addl , %eax
movl %eax, count
选择合适的寄存器。虽然我想如果你在函数调用的开头这样做,%eax
无论如何都会被破坏。
Valgrind 有一个工具“DHAT”——动态堆分析工具——可以收集这些数据。输出的格式不完全是我想要的格式,但对于研究工作来说已经足够接近了。访问计数总结为"average [reads|writes] per byte per allocation";确切的访问计数未报告,也无法从其他报告数据中恢复。也许我将来会进行一些开源开发?
http://valgrind.org/docs/manual/dh-manual.html
valgrind --tool=exp-dhat --show-top-n=100000 --trace-children=yes --log-file="log.file" ./benchmark