私は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#でこれらの呼び出しをインライン化できますか?もしそうなら、どのようにインライン化されているかを知ることができますか?
は、この[解答](http://stackoverflow.com/a/8746128/1991068)を参照してください。 –
その関数のインライン展開では、あまり買わないでしょう。それは実質的に何もしない機能に対してのみ支払います。 –
デリゲートを使用しているという事実は、ほとんど起こりそうにありません。 – leppie