我正在尝试对基于Linux的Intel Pentium上运行的软件进行基准测试。问题是,在使用RDTSC指令时,在连续测试运行期间,我得到了相当大的性能变化。完全相同软件的运行时间在500万到1000万个时钟周期之间变化,因此在最坏的情况下,我的开销为100%。我知道缓存争用会导致性能差异,但是,我是否可以消除其他潜在问题,如中断,其他进程等?
感谢任何有用的提示如何正确地做到这一点。
非常感谢, 肯尼
答案 0 :(得分:4)
这个一般领域的常见问题是:
解决方案:
如果您在多CPU /多核系统上运行单线程进程,则使用CPU亲和性将进程锁定到特定核心。 (从命令行使用taskset或从代码中调用sched_setaffinity()。)
确保没有其他进程占用CPU时间,禁用屏幕保护程序或其他桌面动画,并确保在代码运行时没有屏幕更新。也不要使用例如在代码计时期间,printf到GUI控制台窗口 - 保存任何结果输出,直到收集完最后一个时间戳。 (如果可能的话,你甚至可以考虑完全杀死GUI。)
使用比RDTSC更可靠的计时方法(我通常在Linux上使用clock_gettime(CLOCK_PROCESS_CPUTIME_ID,...))。
禁用自动时钟频率缩放(例如Linux:cpufreq-set)
循环运行代码,比如N次重复,最好为任何大型数据结构重新使用相同的内存分配(以消除VM页面错误的影响等)。忽略第一次测量并平均剩余的N - 1次测量。
答案 1 :(得分:0)
一些常规事情:提高测试进程优先级(man 1 nice),尽可能多地停止其他进程,卸载未使用的内核模块,刷新磁盘缓存(以便后台内核线程的工作量减少),重新启动单 - 用户模式?
答案 2 :(得分:0)
减少系统环境引起的变化的最佳方法是在“单用户”模式下运行基准测试,也称为initlevel 1或“恢复模式”。
您可以通过将“-s”作为启动时选项传递给内核来启动此模式,也可以使用“init 1”将正在运行的系统切换到该模式。
在此模式下,所有守护程序都将停止,并以root用户身份登录。几乎所有在系统上运行的东西都是从您的交互式终端运行的。
答案 3 :(得分:0)
请确保在BIOS和操作系统中停用频率调整。另外听起来你正在使用P4,所以一定要关闭超线程。
由于这些原因,我遇到了过去所描述的性能变化。
This page描述了如何将其打开,这应该会为您提供关闭它所需的内容。
您还需要重新启动计算机并查看BIOS设置,以确定它是否自动执行,而无需操作系统知道。
答案 4 :(得分:0)
您是否考虑过在valgrinds cachegrind或callgrind工具中运行代码? 这些应该能够通过valgrinds“VM”运行代码为您提供准确的指令计数。