8

単純なラムダ式はインライン化されますか?

私は (F# やその他の関数型開発のおかげで) 単一の関数内に存在する繰り返しコードをラムダにカプセル化し、代わりにそれを呼び出す傾向があります。その結果、実行時のオーバーヘッドが発生しているかどうかに興味があります。

var foo = a + b;
var bar = a + b;

Func<T1, T2> op = () => a + b;
var foo = op();
var bar = op();

ランニングコストが高いのはどっち?

4

2 に答える 2

11

パフォーマンスの質問に答えるには、両方の方法で10億回実行します。それぞれのコストを測定します。その後、あなたは知っているでしょう。使用しているハードウェア、関連するシナリオに存在する「ノイズ」、または重要なパフォーマンスメトリックと見なされるものはわかりません。それらを知っているのはあなただけなので、質問に答えられるのはあなただけです。

codegenの質問に答えるには:Jaredは正しいですが、答えを拡張することができます。

まず、C#コンパイラはコードのインライン化を行いません。jitコンパイラはコードのインライン化を行いますが、C#コンパイラがデリゲートインスタンスとしてラムダを生成するという事実は、ジッターがこのコードを合理的にインライン化できる可能性が低いことを意味します。(もちろん、ジッターがこの高度な分析を行って、同じコードが常にデリゲートにあることを確認することは可能ですが、実際にはこれらのアルゴリズムが実装されているとは思いません。

コードをインライン化したい場合は、コードをインラインで記述する必要があります。インラインで記述したくないが、インラインで記述したい場合は、静的メソッドとして記述し、ジッターがインライン化することを期待する必要があります。

しかし、それにもかかわらず、これは時期尚早の最適化のように聞こえます。コードを書きたい方法でコードを書き、そのパフォーマンスを分析してから、遅いものを書き直します。

于 2009-10-07T05:22:15.957 に答える
6

いいえ。Lambda 関数はインライン化されませんが、代わりにデリゲートとして内部に格納され、他のデリゲートと同じ実行コストが発生します。

于 2009-10-07T03:56:55.887 に答える