#c_sharp #net #оптимизация
Давно интересует такой вопрос: есть ли разница (в плане производительности) между 2 фрагментами кода? 1й вариант XDocument xmlDoc = XDocument.Load("File.xml"); var nodes = xmlDoc.DescendantNodes(); // возвращает IEnumerableforeach (XNode node in nodes) { //код } 2й вариант XDocument xmlDoc = XDocument.Load("File.xml"); foreach (XNode node in xmlDoc.DescendantNodes()) { //код } Могу предположить, что foreach работает с энумератором и разницы тут нет, хотя могу и ошибаться, поэтому прошу объяснить. И еще вопрос: если объявлять переменную в цикле, будет ли она обновляться при каждой итерации? Например временная переменная, нужная для хранения промежуточных значений. for(int i=0;i Ответы
Ответ 1
По поводу 1 и 2 варианта. Разницы никакой не будет. Более того, компилятор скорее всего сам сделает с второго варианта первый. Подобный код лучше писать так, как эстетически выглядит красивее, внутри в скомпилированом компилятор сам все сделает красиво. Скорее всего другие скажут о этих вариантах "преждевременная оптимизация". По второму вопросу. В C# переменные живут от точки объявления до закрывающей фигурной скобки текущего уровня. Поэтому, в первом варианте в каждой итерации цикла будет своя переменная tmp. За пределами цикла она будет недоступна. В втором варианте переменная будет доступна за пределами цикла и будет "общая" для всех его итераций. Обычно, в таком примере кода, переменную tmp неплохо сразу инициализировать, к примеру нулем.Ответ 2
Вы занимаетесь иррелевантной оптимизацией. Расходы на XDocument.Load на несколько порядков превосходят разницу между циклами. Всегда запускайте профайлер перед оптимизацией, чтобы он указал вам на те места, в которых происходит реальная просадка производительности. В вашем случае, первый и второй вариант цикла строго одинаковы (оптимизатор имеет право убрать временную переменную), за исключением того, что в первом варианте xmlDoc.DescendantNodes() доступно и после цикла. Выбирайте тот вариант, который вам кажется более читаемым. Точно так же нанооптимизации наподобие вынесения переменной за пределы цикла сделает за вас оптимизатор, и, поверьте, гораздо лучше вас. Хуже того, он заметит, если значения переменной между пробегами цикла связаны, и отменит оптимизацию, если нужно. Дайте машине поработать!
Комментариев нет:
Отправить комментарий