1

ちょっとした文脈のために、私は単純な CPU エミュレーターを書いています。エミュレータ プロセスは、プログラム内の次の操作を読み取って実行するための「ステップ」関数の呼び出しに要約されます。while現在、これはループ内で可能な限り高速に行われています。

コードをクロスプラットフォームにしたいのですが、(残念ながら) Windows が主なターゲットです。

1,000Hz から 100,000Hz の範囲で定期的Emulator->step()に関数を実行できる必要があります。

  • より遅いループの場合は単純に使用sleep()しますが、(少なくとも Windows では) そのような高い周波数の解像度がありません。

  • また、Boost マイクロ秒タイマーをチェックするループを回転させることも試しました。このメソッドの不正確さを無視すると、「アイドル」であることを意図している間、実際の CPU 時間を使い果たします。複数のエミュレートされた CPU をスレッドで同時に実行しているため、whileループがパフォーマンスに顕著な影響を与えています。

C++でやりたいことをする方法は確かにありますか?

4

3 に答える 3

0

Windows では正確にスリープすることはできません (Windows のパフォーマンス カウンター機能が役立つかもしれません。Windowsで nanosleep に相当するものはありますか? を参照してください)。

多くのシミュレートされた CPU をスレッドで同時に実行するとおっしゃいましたが、考えられる解決策の 1 つは、スレッドを破棄して、別の CPU のスケジューリングを自分で行うことです (ラウンド ロビン)。

于 2013-04-04T10:27:02.733 に答える
0

特別な睡眠解決策は必要ありません。各ループの終わりに、寝る必要があるかどうかを計算します。そうでない場合は、次のループを実行します。もしそうなら、計算された量だけ寝てください。このロジックにより、次のループで睡眠が少なくなるため、1 つのループで少し多めに寝ても問題ありません。

于 2013-04-04T10:30:35.723 に答える