す変数を宣言する内部サブブロックの改善実績を教えてください。

StackOverflow https://stackoverflow.com/questions/3402320

  •  25-09-2019
  •  | 
  •  

質問

クライアントまで、フルのC#うませんので、あらかじめご違いの性能を比較する場合は、以下の 代替案?

一つ

void ONE(int x) {

if (x == 10) 
{
    int y = 20;
    int z = 30;
    // do other stuff
} else {
    // do other stuff
}
}

二つの

void TWO(int x) {

int y;
int z;

if (x == 10) 
{
    y = 20;
    z = 30;
    // do other stuff
} else {
    // do other stuff
}
}

void THREE(int x) {

int y = 20;
int z = 30;

if (x == 10) 
{
    // do other stuff
} else {
    // do other stuff
}
}
役に立ちましたか?

解決

すべては他の(の、彼らは通常、あなたは通常、実際にのそれをテストしなければならない理由である、ではない)等しいローカル変数のスコープに終わることから、ONE()deとTWO()は同じIL命令を生成する必要があります全体の方法。 THREE()あれば他の2つはローカル変数に値を格納するために気にしないであろうからx==10が遅くを無視できるほどのになります。

はすべての3つは、何がそれらに格納されていない場合でも、割り当てられているすべての変数のためのメモリ・メモリの同じ量を取ります。それが今まで未使用の変数を探している場合JITコンパイラは、しかし、ここでの最適化を行うことができる。

他のヒント

あな性能の違いなんか可変範囲が問題とそれぞれの例です。

いながらも、異なる三つの意図とその事例ではないが何をしたい:

  1. y、zの範囲の場合です。

  2. y、z以外にはご利用いただける場合のみ実行されるものの、設定条件付.

  3. yとzなのでなければい証するものとする。

もちろん、あなたがは常にのONEを選ぶ、それははるかに読みやすいはずです。それは速いナノ秒の端数により、ある事故ではないことを、読み取り可能なコードはしばしばです。

私はそれが大きな違いを作るだろうとは思いません。あなたが心配する必要があります唯一の時間は、新しいオブジェクトを作成し、初期化した場合、それは高価です。あなたはいつもどんな違いがあるかどうかを確認するために、それぞれの方法にカップルをプロファイルする千回を試みることができるが、私はあなたがいずれかを見つけることができます疑うます。

それはループにで働いたことがあります場合は、私はそれが使われている場所から遠くに宣言を移動するだけです。例えば:ます。

void RunMethod() {
  FormRepresentation formRep = null;
  for (int idx = 0; idx < 10; idx++) {
    formRep = new FormRepresentation();
    // do something
  }
}

これは実際に私には、それがきれいに見える、オブジェクトがまだ作成されているので、任意の違いを作るのではなく。あなたが考慮する必要がある他の事は、変数のスコープです。宣言された変数は、それらが宣言された範囲外で使用することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top