我通过这种方式取得了 100% 一致的结果:
- 使用 MS-DOS 设置 Bochs。
- Set up your toolchain to target MS-DOS
— or —
- 设置您的工具链以针对 32 位 Windows
- 安装HX-DOS扩展器 http://www.japheth.de/HX.html在博克斯。
- 如有必要,破解工具包的标准库/运行时并存根/删除需要未在 HX-DOS 中实现的 Windows API 的功能。当您尝试运行该程序时,扩展程序将打印未实现的 API 列表。
- 将基准测试中的周期数减少几个数量级。
- 用汇编程序包装基准代码
cli
/ sti
说明(请注意,此更改后二进制文件将无法在现代操作系统上运行)。
- 如果您还没有,请使用您的基准测试
rdtsc
时间增量。样品应在cli
…sti
指示。
- 在 Bochs 中运行它!
结果似乎是完全确定性的,但并不是对整体性能的准确评估(有关详细信息,请参阅 Osman Turan 的答案下的讨论)。
作为额外提示,这里有一个与 Bochs 共享文件的简单方法(这样您就不必每次都卸载/重建/重新安装软盘映像):
在 Windows 上,Bochs 将锁定软盘映像文件,但该文件仍以共享写入模式打开。这意味着您无法覆盖该文件,但可以对其进行写入。 (我认为 *nix 操作系统可能会导致覆盖创建新文件,就文件描述符而言。)技巧是使用dd http://en.wikipedia.org/wiki/Dd_%28Unix%29。我设置了以下批处理脚本:
... 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
bfi
是巴特的构建软盘映像 http://www.nu2.nu/bfi/.
然后,只需安装floppy.img
在博克斯。
额外提示#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
每次检测到新的软盘映像时,它将启动测试程序。这样,您可以在单个脚本中自动运行基准测试。
更新:这个方法不太可靠。有时,仅通过重新排序一些测试,计时就会改变多达 200%(使用原始问题中描述的方法在真实硬件上运行时,不会观察到这些计时变化)。