3

アプリにタイム クリティカルなコードがあります。それを実行するスレッドを最高の優先度にしました-それが私ができる最大のことです。

このスレッドで実行されるコードの一部を可能な限り中断しないようにする方法について何か提案はありますか (コンテキスト スイッチの発生を少なくします)。

コードは複雑ではありません。すべてのメソッド呼び出しをインライン コードに置き換え、高レベルのものは使用しません (LINQ を使用しないなど)。演算のほとんどは算術演算です。文字列の比較は1つだけです(それを取り除く方法を考えています)。数学の半分は int で、半分は double です。

コードは x86 .NET 4 C# です。単一の Xenon X3450 W2008R2 で動作します。単一のアプリ サーバー。

(残念ながら、データは x64 をサポートしていないサードパーティ API からのものです (嫌です!))

経験豊富な開発者との大人の議論に感謝します。

PSサーバーにはページングファイルがないため、ハードページフォールトも発生しません(不要なIO操作はありません)。

4

2 に答える 2

2

コンテキスト スイッチに関して心配する必要があるのは、スレッドをブロックすることだけです。したがって、LINQ (つまり、LINQ-to-objects、明らかに LINQ-to-SQL など、ブロッキングを伴うもの) を使用しても問題はありません。あらゆる種類の算術演算や呼び出しメソッドなどもスレッドをブロックしないため、コンテキスト スイッチには影響しません。

あなたが指摘したように、コンテキストの切り替えに影響を与えるもう1つのことは、優先度です。ただし、スレッドの優先度だけでなく、プロセスの優先度も。SetPriorityClassを使用して、プロセスの優先度を上げてABOVE_NORMAL_PRIORITY_CLASS(私はそれよりも高く設定する必要はありません)、スレッドの優先度を通常より上に設定することもできます。

ただし、一般に、優先順位が実際に役立つのは、タイミングの問題である場合(つまり、プロセスが外部入力 (ネットワーク、ユーザー入力、ディスク I/O) にできるだけ速く応答することを確認する場合) のみです。同時に実行されている CPU バウンドの他のプロセスがない限り、実際にはスレッドの実際のスループットにはほとんど影響しません。しかし、そうであれば、優先順位をいじっても長期的な解決策にはなりません。これは、プロセスの 1 つをより高い優先度に設定すると、他のプロセスが完全に枯渇し、実行されなくなることがわかるためです。

とにかく、スレッドとプロセスの優先順位を調整する前に、慎重に検討します。そして、いつものように、テスト、テスト、テスト!

于 2010-06-19T22:56:32.667 に答える
1

代わりにアンマネージ WINAPI コードを作成すると、SetThreadPriority 関数は THREAD_PRIORITY_TIME_CRITICAL (THREAD_PRIORITY_HIGHEST より高い) もサポートします。

スレッドが実行されているプロセスの優先度を上げることも価値があります (実際の優先度は、スレッドとプロセスの優先度の組み合わせによって異なります)。

また、スレッドで I/O 呼び出しを行わないようにする必要があります (ブロックされる可能性があります)。ばかげているかもしれませんが、他のスレッドで I/O 呼び出しを行わないようにすることもできます (これにより、それらのスレッドの優先度が一時的に高くなる可能性があります)。

于 2010-06-19T22:42:11.450 に答える