4

関数の戻り値を受け入れるローカル変数を作成すると、.Net アプリケーション、特に ASP.Net でメモリ使用量またはパフォーマンスが低下することを知りたいだけです。

いう

 MyObject myObject = Foo();
 MyOtherObject myOtherObject = Boo();

 SomeFuntion(myObject, myOtherObject);

また

使うべきか

 MyFunction(Foo(), Boo());

確かに、前者の使用法の方が読みやすくなっています。しかし、メモリ使用量とパフォーマンスはどうでしょうか。

よろしくお願いします 123Developer

4

4 に答える 4

15

時期尚早に最適化しないでください。リリース ビルドでは、コンパイラがこれらを最適化して削除する可能性が非常に高くなります。いずれにせよ、(おそらく) いくつかの参照のための少量のスタック スペースについて話しているだけです。どちらの方法でもかまいません。より読みやすい方を使用してください。

于 2009-03-15T18:30:47.947 に答える
5

CIL (C# がコンパイルされる中間言語) はスタックベースの言語であるため、中間関数の戻り値は、最終関数に引数として渡される前に、最終的にスタックに格納される必要があります。

ローカルに関してC# コンパイラが何をするか[1]を予測する方法はありません。そうするときにローカルを使用することを決定するか、スタック動作を使用してそれらを完全にスキップする場合があります。同様に、ローカルを使用しない場合でもローカルを合成する場合としない場合があります。

いずれにせよ、パフォーマンスの違いは心配する価値はありません。


[1]はい、もちろん、それが生成する IL をコンパイルして調べて、それが何をするかを判断することはできますが、それは使用しているコンパイラの現在のバージョンに対してのみ有効であり、実装の詳細であってはなりません。に頼る。

于 2009-03-15T18:36:26.700 に答える
2

メモリ性能は基本的に同じだと思います。また、パフォーマンス テストで大きな違いが見られない場合は、読みやすさが向上したオプションを選択してください。

于 2009-03-15T18:31:26.727 に答える
0

ローカル変数を使用することを恐れないでください。メモリ使用量とパフォーマンスの違いは非常に小さいか、まったくない場合もあります。

特定のケースでは、ローカル変数は 8 バイト (64 ビット アプリケーションでは 16 バイト) のスタック スペースを使用する場合があります。ただし、一時的なストレージに必要な場合、コンパイラはそれ自体でローカル変数を作成できるため、両方のバージョンが同じローカル変数のセットを持つ可能性があります。

また、コンパイラは一部のローカル変数に対してスタック スペースの代わりにプロセッサ レジスタを使用できるため、ローカル変数の作成が実際にスタック スペースを使用するかどうかさえ定かではありません。

とにかく、スタックスペースの割り当ては非常に安価です。メソッドが呼び出されると、メソッド内のローカル データ用のスタック フレームが作成されます。より多くのメモリを割り当てる必要がある場合、それはスタック ポインターの移動量を変更するだけであり、余分なコードはまったく生成されません。

そのため、保守が容易で堅牢になるようにコードを記述し、変数の使用を最適化するコンパイラを信頼してください。

于 2009-03-15T21:04:37.450 に答える