1

2 mhz の速度を「エミュレート」するために「スリープ」する必要があるミリ秒数を判断する簡単な方法はありますか。つまり、命令を実行し、System.Threading.Thread.Sleep() 関数を X ミリ秒呼び出して、2 mhz をエミュレートしたいと考えています。これはミリ秒単位で正確である必要はありませんが、取得できる球場はありますか? PC のクロック速度を 2 mhz か何かで割るフォーラムレートはありますか?

ありがとう

4

4 に答える 4

1

スリープは、能力の低いCPUでコードを実行するための適切なプロキシではないことに注意してください。クロックレート以外にも、計算パフォーマンスに影響を与えるものはたくさんあります。多くの場合、クロックレートは、計算パフォーマンスを決定する2次または3次(または10次)です。

また、QueryPerformanceCounter()は、ほとんどのシステムで高解像度が高価であることに注意してください(多くの場合、3000〜5000 CPUクロック)。その理由は、システムコールと、システムのサウスブリッジにあるHPETからの複数の読み取りが必要になるためです。(これはシステムによって異なることに注意してください)。

あなたがやろうとしていることを私たちがよりよく理解するのを手伝っていただけませんか?

James Blackの回答に関するコメントで述べたように、タイマー呼び出し(QPCや直接X stufFなど)をポーリングしないでください。スレッドは単純に大量のCPUサイクルを消費し、優先度の低いスレッドを実行させず、ほとんどの場合、その優先度で消費します。NTスケジューラはスレッドの優先順位を調整することに注意してください。これは「ブースト」と呼ばれます。スレッドがブーストされ、ポーリングループのいずれかにヒットした場合、ほぼ確実にパフォーマンスの問題が発生します。これは、システムの観点からは非常に悪い動作です。可能な限り避けてください。

別の言い方をすれば、WindowsはマルチタスクOSであり、ユーザーは多くのことを実行します。アプリはより大きなコンテキストで実行されており、その動作はシステム全体に影響を与える可能性があることに注意してください。

于 2009-10-15T15:49:18.640 に答える
1

ユーザーにとっては、100 ミリ秒未満の一時停止は通常、感知できません。それに基づいて、各命令の後にスリープを試みる代わりに、50 ミリ秒程度実行してから、適切な時間スリープしてから、さらに 50 ミリ秒実行する方がはるかに優れています。

ただし、クロックが 2 MHz のほとんどのプロセッサ (Z80 など) は、実際には 1 秒あたり 200 万の命令を実行しなかったことにも注意してください。2 MHz Z80 は、1 つの命令をフェッチするのに最低 4 プロセッサ クロックを要し、最大命令レートは 500 KHz でした。

于 2009-10-15T15:37:18.933 に答える
1

2 MHz クロックの周期は 500 ns です。Sleep の引数はミリ秒単位であるため、Sleep(1) を使用したとしても、2,000 サイクルを逃すことになります。

さらに悪いことに、Sleep は X ミリ秒後に戻るとは約束せず、少なくともX ミリ秒後に戻るとだけ約束します。

あなたの最善の策は、プログラムがデータを消費したり生成したりしないようにするイベントである種のタイマーを使用することです。

于 2009-10-15T03:06:19.287 に答える
0

問題は、Windowsでの最小スリープが約20〜50ミリ秒であるように見えることです。したがって、1ミリ秒間スリープしたいと言っても、他のプロセスが実行されているため、後でウェイクアップします。タイムスライスはかなり大きいです。

500ns(1 / 2e06 * 1000)などの短い時間が必要な場合は、DirectXを使用することをお勧めします。これは、高解像度のタイマーを備えているため、一時停止が完了するまでループすることができますが、コンピュータを引き継ぐ必要があり、他のプロセスが何が起こっているのかを中断させないようにする必要があります。

于 2009-10-15T03:13:06.490 に答える