Проверить, если переменная нуль, прежде чем присвоить ноль? - PullRequest
6 голосов
/ 24 февраля 2009

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

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

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

Ответы [ 8 ]

31 голосов
/ 24 февраля 2009

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

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

7 голосов
/ 24 февраля 2009

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

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

Ты понял.

3 голосов
/ 24 февраля 2009

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

2 голосов
/ 26 февраля 2009

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

2 голосов
/ 24 февраля 2009

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

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

foo = NULL;

Причины таковы,

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

1 голос
/ 24 февраля 2009

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

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

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

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

1 голос
/ 24 февраля 2009

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

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

1 голос
/ 24 февраля 2009

foo = null;

if (foo != null)
   foo = null;

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

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

...