Объявление переменных внутри подблоков улучшит производительность? - PullRequest
5 голосов
/ 04 августа 2010

В C # будет ли разница в производительности при сравнении следующих ТРИ альтернатив?

ONE

void ONE(int x) {

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

TWO

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 голосов
/ 04 августа 2010

При прочих равных условиях (, а обычно нет), поэтому обычно вам приходится проверять его ), ONE() и TWO() должны генерировать одинаковые инструкции IL, поскольку локальные переменные заканчиваютсядо всего метода.THREE() будет незначительно медленнее, если x==10, так как другие два не будут хранить значения в локальных переменных.

Все три занимают одинаковое количество памяти -память для всех переменных выделяется, даже если в них ничего не хранится.Однако JIT-компилятор может выполнить оптимизацию, если он когда-либо ищет неиспользуемые переменные.

1 голос
/ 04 августа 2010

Конечно, вы должны всегда выбирать ОДИН, это гораздо более читабельно.То, что он быстрее на долю наносекунды, не случайно, часто читаемый код.

1 голос
/ 04 августа 2010

Там нет разницы в производительности, но вы найдете проблемы переменной области между этими примерами.

Вы также показываете три разных намерения между этими примерами, а это не то, что вам нужно:

  1. y и z ограничены областью применения оператора if.

  2. y и z используются вне оператора if, но задаются условно.

  3. y и z не имеют ничего общего с оператором if.

0 голосов
/ 04 августа 2010

Я не думаю, что это будет иметь большое значение. Единственное время, о котором вам нужно беспокоиться, это если создание нового объекта и его инициализация обходятся дорого. Вы всегда можете попробовать профилировать каждый метод пару тысяч раз, чтобы увидеть, есть ли различия, но я сомневаюсь, что вы найдете их.

Единственный раз, когда я перемещаю объявление дальше от того места, где оно используется, это когда оно будет обработано в цикле. e.g.:

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

На самом деле это не имеет никакого значения, поскольку объект все еще создается, но для меня это выглядит чище. Другая вещь, которую вы должны рассмотреть, это область действия переменной. Объявленные переменные нельзя использовать вне области, в которой они были объявлены.

...