valgrind 'callgrind' 指令获取在运行之间有所不同

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

我目前正在分析 C++ 可执行文件,以确定代码更改是否会影响性能。对于分析,我使用“valgrind/callgrind”。

我找不到任何文档,为什么测试下的相同的可执行文件运行之间的“Ir”(读取指令)会产生不同的结果数字:

第一次运行:

==2800==
==2800== Events    : Ir
==2800== Collected : 68723519295
==2800==
==2800== I   refs:      68,723,519,295

第二次运行:

==2821==
==2821== Events    : Ir
==2821== Collected : 68723289248
==2821==
==2821== I   refs:      68,723,289,248

我认为这是由于 CPU 优化造成的,并且是预期的,但我想参考并确认这一点。如果有人知道以下问题的答案并提供参考详细信息,我将不胜感激:

  • 每次执行预计会有不同的“Ir”吗?
  • 如果是预期的话,代码更改“Ir”编号无法确定更新速度有多快/慢?或者它应该只是改进的估计(例如,如果“Ir”减少约 15%,那么它会更快等?)
  • 可以在 valgrind/callgrind 中使用任何选项来最小化,甚至可以使测试运行之间的“Ir”编号保持一致?

谢谢,

profiling valgrind callgrind
1个回答
0
投票

花了一些时间进行更深入的调查后,我意识到该进程是多线程的!多线程执行在“Ir”执行中不是确定性的,这是有道理的。 修改可执行文件后,作为单线程进程运行,我看到了预期的周期匹配:

第一次运行:

==3098==我参考:68,659,014,339

第二次运行:

==3136==我参考:68,659,014,339

只是发布这个答案,以防其他人将来可能遇到类似的问题。

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