Страницы

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

понедельник, 1 апреля 2019 г.

Что предпочесть: int x = arr.Lenth + strText.Append(x) или strText.Append(arr.Lenth)?

Что предпочесть для вывода длины массива:
передать в переменную int x = arr.Lenth, и уже потом сделать strText.Append(x);
или обойтись без промежуточных этапов: strText.Append(arr.Lenth);

Проблема, если правильно понимаю, связана с уничтожением объектов сборщиком мусора. В первом случае в памяти останется только переменная х, во-втором - до момента вывода arr.Length массив будет находится в памяти. Или нет?


Ответ

Вы бы сперва обозначили скоупы, в которых у вас находятся arr и вызов strText.Append()

Предположим, они находятся внутри одно скоупа.
Есть один важный постулат о работе сборщика мусора:
Время сборки объектов недетерминировано и зависит от реализации CLR
Этому есть куча причин, в которые для ответа вдаваться не нужно. Главное, что из этого постулата вытекает следующее: все потуги рассудить, какой вариант лучше, в общем-то бесполезны.
void Foo() { int arr = new int[5]; int x = arr.Length; // какой-то длинный код strText.Append(x); // в этом месте память из-под arr еще может быть не освобождена! }
Десктопная CLR, как правило, убирает объекты еще до выхода из скоупа, как только они становятся не нужны, поэтому теоретически переменная x имеет смысл.

Если переменные arr и вызов strText.Append() находятся в разных скоупах, время между заполнением массива и вызовом метода сильно неопределенное и на момент вызова метода массив уже давно не нужен, тогда сохранение длины массива тоже теоретически имеет смысл. Чуть больший, чем в первом случае :).

Почему теоретически? Во всех рассуждения об оптимизациях нужно руководствоваться только практикой. Как говорил классик: "Преждевременная оптимизация -- корень всех зол". Поэтому подобные вещи стоит принимать во внимание только когда "припрет": приложение начнет потреблять много памяти, процесс начнет много времени проводить в GC и т.д. Вот тогда берем в руки профайлер, смотрим на неоптимальные участки кода и вносим исправления. А до тех пор подобные вопросы имеют чисто теоретическую направленность.

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

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