2013-03-30 5 views
6

私はC#でパフォーマンスクリティカルなアプリケーションを作成しており、コアの演算は重みの計算です。この関数は次のようになります。C#はこれらの関数をインライン化しますか?

public void ForEachWeight(Action<int, int, float> action) 
{ 
    for (int lower = 0; lower < LowerLayerSize; lower++) { 
     for (int upper = 0; upper < UpperLayerSize; upper++) { 
      action(lower, upper, Weights[(lower * UpperLayerSize) + upper]); 
     } 
    } 
} 

そして、それはのような様々な簡単な機能を備えた場所の数十に呼び出されます:

if (activationMethod == ActivationMethod.Binary) { 
    ForEachWeight((lower, upper, weight) => upperLayer.Values[upper] += weight; 
} else { 
    ForEachWeight((lower, upper, weight) => upperLayer.Values[upper] += lowerLayer.Values[lower] * weight); 
} 

すべての変数にアクセスできるように、すべてのコールは、同じクラス内から実行されています。これらの関数呼び出しをC#でインライン化できますか?それは数十、私は巨大なオーバーヘッドだと思います余分な関数呼び出しの何千ものを意味していない場合

if (activationMethod == ActivationMethod.Binary) { 
    for (int lower = 0; lower < LowerLayerSize; lower++) { 
     for (int upper = 0; upper < UpperLayerSize; upper++) { 
      upperLayer.Values[upper] += weight; 
     } 
    } 
} else { 
    for (int lower = 0; lower < LowerLayerSize; lower++) { 
     for (int upper = 0; upper < UpperLayerSize; upper++) { 
      upperLayer.Values[upper] += lowerLayer.Values[lower] * weight); 
     } 
    } 
} 

:私は、上記の呼び出しはこのような何かをインライン化することができ、たとえば思っています。これにより10%のスピードアップさえあれば、それはまったく価値があります。私は多くのコードを書き直さなければならないので、比較のために手動でインライン展開して簡単にベンチマークすることはできません。

私の質問はC#でこれらの呼び出しをインライン化できますか?もしそうなら、どのようにインライン化されているかを知ることができますか?

+0

は、この[解答](http://stackoverflow.com/a/8746128/1991068)を参照してください。 –

+0

その関数のインライン展開では、あまり買わないでしょう。それは実質的に何もしない機能に対してのみ支払います。 –

+0

デリゲートを使用しているという事実は、ほとんど起こりそうにありません。 – leppie

答えて

11

インライン展開はJITコンパイルで行われるため、実行時にインライン展開を確認す​​るためにコードを検査する必要があります。これはデバッガを使用して行うことができますが、CLRがデバッガの存在を検出すると、さまざまな最適化が無効になるため、メソッドがコンパイルされた後でデバッガをアタッチする必要があることに注意してください。

WinDbg/SOSを使用して方法を見つける方法については、theseanswersを参照してください。

関連する問題