对CPU绑定算法/实现进行基准测试

Vla*_*eev 4 cpu performance benchmarking

假设我StringBuilder用编译语言编写自己的语言(例如C++).

衡量各种实施性能的最佳方法是什么?简单地计时几十万次运行会产生高度不一致的结果:从一批到另一批的时间差异可能高达15%,因此无法准确评估潜在的性能改进,从而使性能提升小于此.

我做了以下事情:

  1. 禁用SpeedStep
  2. 使用RDTSC进行计时
  3. 以实时优先级运行该进程
  4. 将亲和力设置为单个CPU核心

这有点稳定了结果.还有其他想法吗?

Vla*_*eev 7

我以这种方式获得了100%一致的结果:

  1. 用MS-DOS设置Bochs.
  2. 设置工具链以定位MS-DOS
    - 或 -
    1. 设置工具链以定位32位Windows
    2. 在Bochs中安装HX-DOS扩展器.
    3. 如有必要,破解您的工具包的标准库/运行时,并删除/删除需要在HX-DOS中未实现的Windows API的功能.当您尝试运行该程序时,扩展程序将打印未实现的API列表.
  3. 将基准测试中的周期数减少几个数量级.
  4. 用汇编程序cli/ sti指令包装基准代码(注意在此更改后二进制文件不能在现代操作系统上运行).
  5. 如果您还没有,请让您的基准使用rdtsc增量进行计时.样品应在cli...... sti说明中.
  6. 在Bochs中运行它!

Bochs截图

结果似乎完全是确定性的,但不是对整体表现的准确评估(详见Osman Turan的答案下的讨论).


作为奖励提示,这是与Bochs共享文件的简单方法(因此您不必每次都卸载/重建/重新安装软盘映像):

在Windows上,Bochs将锁定软盘映像文件,但该文件仍以共享写入模式打开.这意味着您无法覆盖该文件,但您可以写入该文件.(我认为*nix操作系统可能会导致覆盖创建一个新文件,就文件描述符而言.)诀窍是使用dd.我设置了以下批处理脚本:

... benchmark build commands here ...
copy /Y C:\Path\To\Benchmark\Project\test2dos.exe floppy\test2.exe
bfi -t=288 -f=floppysrc.img floppy
dd if=floppysrc.img of=floppy.img
Run Code Online (Sandbox Code Playgroud)

bfi是Bart的Build Floppy Image.

然后,就floppy.img在Bochs上山.


额外提示#2:为避免每次在Bochs中手动启动基准测试,请go.txt在软盘目录中放置一个空文件,然后在Bochs中运行此批处理:

@echo off
A:
:loop
choice /T:y,1 > nul
if not exist go.txt goto loop
del go.txt
echo ---------------------------------------------------
test2
goto loop
Run Code Online (Sandbox Code Playgroud)

每次检测到新的软盘映像时,它都会启动测试程序.这样,您就可以在单个脚本中自动执行基准测试.


更新:此方法不太可靠.有时,通过重新排序一些测试,时间将改变200%(使用原始问题中描述的方法在真实硬件上运行时未观察到这些时序变化).