что эффективнее? проверка == или просто мутирование переменной? - PullRequest
3 голосов
/ 14 июня 2010

Представьте, что у меня есть переменная с именем X. Допустим, каждые 5 секунд я хотел сделать X = true. (это может быть либо истина, либо ложь в промежутке между этими 5 секундами, но после истечения 5 секунд значение сбрасывается до истины).

Было бы эффективнее проверить, является ли значение уже истинным, а если нет, переназначить его на true? Или просто X = true?

другими словами, что будет работать быстрее?

if(x==false){
    x = true;
}

против

x = true;

С одной стороны, первая программа не будет изменять переменную, если в этом нет необходимости. С другой стороны, второй программе не нужно проверять, чему равен X; он ныряет прямо внутрь.

Ответы [ 4 ]

8 голосов
/ 14 июня 2010
  • Это почти всегда не имеет значения. Напишите код, который легче всего понять и поддерживать. Оптимизируйте его только при необходимости.
  • Лучший способ убедиться в этом - проверить это. Профилируйте свой код.
  • Что быстрее, может зависеть от браузера.
  • Что быстрее, зависит от того, является ли переменная обычно истинной или ложной.
  • Сказав это, я предполагаю, что в большинстве сценариев установка переменной без тестирования будет быстрее.
4 голосов
/ 14 июня 2010

Действительно зависит от ваших данных:)

Если x == false 90% времени, прямое присвоение x будет быстрее.

Это одно из тех мест, где вы, вероятно, не хотите беспокоиться об эффективности, и если вы действительно это делаете, профилируйте его ..

2 голосов
/ 14 июня 2010

Отказ / Предупреждение:

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

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

Кроме того, в этих ситуациях удобочитаемость всегда должна преобладать над микрооптимизацией без узких мест (хотя мой ответ ниже учитывает только эффективность времени выполнения, как было запрошено). Поэтому мой рекомендуемый код для использования в этой ситуации - x=true, поскольку его легче всего читать и понимать.

Наконец, если добавление проверки улучшит скорость, компилятор, вероятно, уже знает это и сделает это за вас, так что вы не ошибетесь с x=true (вот почему вы должны отключить оптимизацию перед запуском профилировщика) .


Ответ:

Единственный верный способ выяснить это - профилирование. Вы можете обнаружить, что тест 0 (x == false) вообще не требует времени, и поэтому его стоит включить из-за экономии времени, когда x оказывается верным. Или вы можете обнаружить, что проверка занимает достаточно много времени и тратит слишком много времени, когда x оказывается ложным.

Я предполагаю, что тест не нужен. Это связано с тем, что 0-тестирование и другие побитовые операции (и, или, и т. Д.) Выполняются настолько быстро, что я обычно рассматриваю их как занимающие одинаковое элементарное количество времени. И если 0-тестирование занимает столько же времени, сколько операция ИЛИ (при значении true), то 0-тест является излишней тратой времени. Конечно, профилирование может доказать, что я ошибаюсь, и мое предположение основано на неверных предположениях о побитовых операциях, поэтому, если вы решите запустить профилировщик и выяснить это, меня определенно заинтересуют результаты.

1 голос
/ 14 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...