17

この変数に割り当てられた値を直接返す場合と比較して、関数で一時変数を作成する場合、パフォーマンス ヒットまたはメモリ消費の違いはありますか?

たとえば、これらの関数 (GetValue) のどちらがパフォーマンスとメモリの節約に優れているか、または両方がまったく同じである:

ケース 1:

  private string GetValue()
  {
     return this.GetResult();
  }

  private string GetResult()
  {
     // Code here that return a big string...
  }

ケース 2:

  private string GetValue()
  {
     string result = this.GetResult();

     return result;
  }

  private string GetResult()
  {
     // Code here that return a big string...
  }

ありがとうございました。

4

3 に答える 3

17

これらの基本的な状況では、読みやすさは常にパフォーマンスの違いに勝ります。私はこれをせいぜいマイクロ最適化と考えていますが、これらは主に時間の無駄であることが判明しています。これで節約できるものは、非決定論的な GC の実行によって食い尽くされます。

ほとんどの場合、コンパイラが最適化を許可されている場合、結果のコードに違いはありません。この場合の結果の IL には、スタック上の文字列を参照するための余分なオペ コードがいくつかあるように見えますが、JIT がこれをどうするかは誰にもわかりません。

戻る前に一時変数に分割して確認することもありますが、パフォーマンスへの影響について心配することはありません。最も重要なことは、パフォーマンスの問題を解決するためにこの種の改善が必要なケースを見たことがありません.

于 2012-08-03T14:52:17.893 に答える
6

ローカル変数が実行可能コードによって実際に使用され、最適化されていない場合、違いは依然として最小限です。

ローカル変数は、参照を格納するために必要なスタック スペースのみを使用し、スタック フレームは常に割り当てられるため、そのスペースの割り当てにまったく時間がかかりません。

ローカル変数との間で余分なコピーを作成する時間は、ほとんど測定できません。タイトなループでメソッドを何百万回も呼び出す場合にのみ違いが生じますが、文字列の割り当てにかかる時間と比較して、実行時間はごくわずかです。

于 2012-08-03T15:06:46.573 に答える