私は、このように100%一致した結果を達成した:
- は、MS-DOSとBochsのを設定します。
- MS-DOS
—または—
- はBochsの中HX-DOS extenderをインストール
- 32ビット版のWindowsをターゲットに、あなたのツールチェーンを設定対象とするあなたのツールチェーンを設定します。
- 必要に応じて、ツールキットの標準ライブラリ/ランタイムをハックし、HX-DOSに実装されていないWindows APIが必要な機能をスタブアウト/削除します。エクステンダーは、プログラムを実行しようとすると、実装されていないAPIのリストを出力します。
- ベンチマークのサイクル数を数桁減らしてください。
- ベンチマークコードをアセンブラ
cli
/sti
(この変更後に最新のOSでは実行されないことに注意してください)で囲みます。
- まだベンチマークを使用していない場合は、タイミングのためにデルタを
rdtsc
で使用してください。サンプルはcli
&hellip内にある必要があります。 sti
命令
- Bochsで実行してください!
![Bochs screenshot](https://i.stack.imgur.com/0lqi8.png)
結果は完全に決定論的であると思われるが、全体的なパフォーマンス(詳細については、オスマン・トゥランの答えの下で議論を参照)の正確な評価ではありません。ボーナスチップとして
は、ここに(あなたが毎回リビルド/フロッピーイメージを再マウント/アンマウントする必要はありません)Bochsのとファイルを共有する簡単な方法です:Windowsでは
を、Bochsのは、意志フロッピーイメージファイルをロックしますが、ファイルはまだ共有書き込みモードで開かれています。つまり、ファイルを上書きすることはできませんが、書き込むことはできます。 (私は* nixのOSは、ファイルディスクリプタに関する限り、新しいファイルを作成するために上書きを引き起こすかもしれないと思う)。トリックは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
bfi
はバートのBuild Floppy Imageです。
次に、Bochsにfloppy.img
をマウントするだけです。
ボーナス先端#2:手動で、ベンチマークにBochsの中のすべての時間を開始floppyディレクトリに空の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%も変化することがあります(元の質問に記載されている方法を使用して実際のハードウェアで実行した場合、
数十万回以上の実行を試してください。各ベンチマークを少なくとも10秒間実行します。 – Mysticial
確かに、それは私の転倒計画です。それは少し流れを壊します:) –
私の経験から、1秒未満のタイミングは、ハードウェアとパフォーマンスカウンターでも非常に一貫性のない結果をもたらします。 – Mysticial