Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Создание переменной ссылочного типа при каждой итерации цикла. Это затратно?

Есть вот такой код:
... Match match; foreach (var value in egeQuestionValues) { match = Regex.Match(value, $@"(?<={number}\()\d+(?=.*%\))"); if (!match.Success) throw new ArgumentException($"The record {value} is incorrect", nameof(egeQuestionValues));
egeQuestionIntValues.Add(int.Parse(match.Value)); }
return egeQuestionIntValues.Average();
Я создал переменную match специально вне цикла foreach, чтобы в рантайме не создать ее при каждой итерации. Делал, думаю что это затратно. Но ReSharper мне советует отрефакторить этот код таким образом:
... foreach (var value in egeQuestionValues) { var match = Regex.Match(value, $@"(?<={number}\()\d+(?=.*%\))"); if (!match.Success) throw new ArgumentException($"The record {value} is incorrect", nameof(egeQuestionValues));
egeQuestionIntValues.Add(int.Parse(match.Value)); }
return egeQuestionIntValues.Average();
т.е. сейчас при каждой итерации переменная match будет создаваться каждый раз. Разве это не затратно? ReSharper советует поступать так не только с типом Match и с другими типами так было.


Ответ

Разницы особой нету.
Все переменные ссылочного типа без инициализации автоматически инициализируются null-значением.
Что сама по себе переменная ссылочного типа? Это переменная, которая ссылается на какой-то адрес.
Смена ссылки - это быстрая операция, так как не создается никаких дополнительных объектов, как это происходит со значимым типом.
Скорее всего, компилятор приведет код к первому случаю и IL-код будет идентичным.
На мой взгляд овчинка выделки не стоит и это не узкое место, ведь вы программируете на высокоуровневом языке программирования, где на первое место нужно ставить понятность кода, а уж потом если где-то что-то тормозит, то оптимизировать.
Второй вариант более приятен, так как переменная находится прямо в месте ее использования и можно сразу понять, что за циклом она нигде использоваться не будет.

Комментариев нет:

Отправить комментарий