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

Это линия, которая доставляет вам неприятности: {% for int in int_details_{{item.hostname}} %}. Вы не можете использовать расширение переменной jinja2 внутри инструкции jinja2.

Это решит вашу текущую проблему: {% for int in lookup('vars', 'int_details_' + item.hostname) %}

6
задан Albert 26 February 2009 в 15:36
поделиться

8 ответов

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

Мы должны забыть о маленькой эффективности, сказать приблизительно 97% времени: преждевременная оптимизация является корнем всего зла. - Donald Knuth

31
ответ дан 8 December 2019 в 02:08
поделиться

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

Или это не вызывает беспокойство ни о чем?

Вы получили его.

7
ответ дан 8 December 2019 в 02:08
поделиться

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

3
ответ дан 8 December 2019 в 02:08
поделиться

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

2
ответ дан 8 December 2019 в 02:08
поделиться

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

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

foo = NULL;

Причем причины - это,

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

2
ответ дан 8 December 2019 в 02:08
поделиться

foo = null;

if (foo != null)
   foo = null;

Если бы я смотрю на второй блочный код, я думал бы, что Вы только хотели установить переменную нечто в NULL, если бы это не было пустым прежде, и если бы я смотрю на первый код, я думал бы, что Вы хотели установить переменное нечто в NULL так или иначе.

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

1
ответ дан 8 December 2019 в 02:08
поделиться

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

И это не оптимизация. На самом современном CPU, если операторы являются довольно дорогими.

1
ответ дан 8 December 2019 в 02:08
поделиться

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

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

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

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

1
ответ дан 8 December 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: