私は次のコードを持っています:
while(flag)
{
Thread.SpinWait(1);
}
SpinWait
以下はinの実装ですRotor(sscli20\clr\src\vm\comsynchronizable.cpp)
FCIMPL1(void, ThreadNative::SpinWait, int iterations)
{
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;
for(int i = 0; i < iterations; i++)
YieldProcessor();
}
FCIMPLEND
Thread.SpinWait
呼び出されたときにインライン化されますか?
そうでない場合、各ループ サイクルでより多くの時間を費やしstack operations(push and pop)
、CPU の実行リソースをより多く消費します。
はいの場合、スタック操作(プッシュとポップ)を含む標準関数命令シーケンスとして実装されている間、どのようにclr
それを達成しますか?ThreadNative::SpinWait
Eren のテストでは、デバッグ モードでインラインは発生しません。clr 最適化してインライン コードを生成することは可能ですか?
まとめ: ご回答ありがとうございます。いつの日か clr が MethodImplOptions.InternalCall などの 1 つのメカニズムによってプリコンパイル済みコードをインライン化できるようになることを願っています。次に、スタック操作を排除し、フラグのチェックとスピン待機にほとんどの時間を費やすことができます (nop よりも少ない CPU リソースを消費します)。