5

C#では、次の3つの選択肢を比較すると、パフォーマンスに違いはありますか?

1

void ONE(int x) {

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

2

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
}
}
4

4 に答える 4

4

他のすべてが等しい場合(通常はそうではないため、通常は実際にテストするONE()必要があります)、TWO()ローカル変数はメソッド全体にスコープされるため、同じIL命令を生成する必要があります。他の2つがローカル変数に値を格納することを気にしないので、無視できるほどTHREE()遅くなります。x==10

3つすべてが同じ量のメモリを使用します。つまり、変数に何も格納されていなくても、すべての変数のメモリが割り当てられます。ただし、JITコンパイラは、未使用の変数を検索する場合は、ここで最適化を実行できます。

于 2010-08-04T03:20:18.187 に答える
1

パフォーマンスの違いはありませんが、これらの各例の間に可変スコープの問題が見つかります。

また、これらの例の間に3つの異なる意図を示していますが、これはあなたが望むものではありません。

  1. yとzは、ifステートメントのスコープに制限されます。

  2. yとzはifステートメントの外で使用されますが、条件付きで設定されます。

  3. yとzは、ifステートメントとは何の関係もありません。

于 2010-08-04T03:19:48.310 に答える
1

もちろん、常に1つを選択する必要があります。これは、はるかに読みやすくなっています。ナノ秒の何分の1かという速さは偶然ではなく、読み取り可能なコードは偶然であることがよくあります。

于 2010-08-04T03:38:31.360 に答える
0

あまり違いはないと思います。心配する必要があるのは、新しいオブジェクトを作成して初期化するのに費用がかかる場合だけです。いつでも各メソッドのプロファイルを数千回試して、違いがあるかどうかを確認できますが、違いが見つかるとは思えません。

宣言を使用場所からさらに遠ざけるのは、ループで処理する場合のみです。例えば:

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

オブジェクトはまだ作成されているので、実際には何の違いもありませんが、私には、よりきれいに見えます。考慮する必要があるもう1つのことは、変数のスコープです。宣言された変数は、宣言されたスコープ外では使用できません。

于 2010-08-04T03:21:44.423 に答える