Проверить, является ли переменная нулевой перед присвоением нулю?

Дорогое ли присвоение переменных по сравнению с нулевой проверкой? Например, стоит ли перед присвоением ему значения null проверять, что foo не равно нулю?

if (foo != null) {
     foo = null;
}

Или это ни о чем не беспокоит?

Ответов (8)

Решение

Это микро-микро-оптимизация (и, возможно, в любом случае что-то обрабатывается компилятором). Не беспокойся об этом. Вы получите гораздо больший доход, если сосредоточитесь на реальном алгоритме вашей программы.

Мы должны забыть о небольшой эффективности, скажем, в 97% случаев: преждевременная оптимизация - это корень всех зол. - Дональд Кнут

Это на самом деле (очень, очень немного) менее эффективно. Назначение переменных примерно эквивалентно проверкам на null, плюс возможна дополнительная ветвь. Не то чтобы это имеет большое значение.

Или это ни о чем не беспокоит?

Ты понял.

Это сделает ваш код настолько трудным для чтения, что даже если бы это была оптимизация, это не стоило бы хлопот.

И это не оптимизация. На большинстве современных процессоров операторы if довольно дороги.

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


foo = null;

if (foo != null)
   foo = null;

Если бы я посмотрел на второй блок-код, я бы подумал, что вы хотите установить для переменной foo значение null только в том случае, если раньше она не была нулевой, и если я посмотрю на первый код, я подумаю, что вы хотите установить для переменной foo значение null в любом случае.

Я знаю, что это из-за примера, который вы написали, но в конечном итоге такая микрооптимизация только добавляет путаницы (это того не стоит).

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

Фактически, некоторые могут возразить, что присвоение null вообще является запахом кода (см. Детектор PMD для NullAssignment ):

Присвоение переменной «null» (вне ее объявления) обычно является плохим тоном. Иногда назначение является признаком того, что программист не полностью понимает, что происходит в коде. ПРИМЕЧАНИЕ. В редких случаях такое назначение может быть полезно для стимулирования сборки мусора. Если это то, для чего вы его используете, во что бы то ни стало, не обращайте внимания на это правило :-)

В общем, я лично с подозрением отношусь ко всему, что пытается стимулировать сборку мусора (вы почти всегда получаете эффекты, которых не ожидали).

Прежде всего, это микрооптимизация. Так что не нужно сильно об этом беспокоиться.

Но чтобы ответить на ваш вопрос, вам нужно сократить его до одной строки. (поскольку весь ваш код - это установить его в NULL).

foo = NULL;

Причины в том, что

Сравнение - гораздо более дорогостоящая операция, чем присвоение. (Поскольку сравнение съедает много инструкций по сборке сравнительно. Обычно вычитание и сравнение с нулем или XOR и сравнение с нулем). Назначение требует меньше инструкций.

Если у вас есть достойный компилятор, они будут генерировать идентичный код. Если у вас плохой компилятор, то if будет хуже. В 2009 году аппаратное присвоение переменных было очень дешевым, а условные переходы иногда были дорогими.