2010-06-14 5 views
3

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

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

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

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

против

x = true; 

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

+1

Это не будет иметь каких-либо заметных различий (если у установки x не было побочных эффектов, таких как диспетчеризация событий, вызвавших реакцию слушателей и т. Д., И в этом случае ответ «это зависит»). Сделайте все, что имеет смысл в вашей программной логике. –

ответ

8
  • Это почти всегда не имеет значения. Напишите код, который легче всего понять и сохранить. При необходимости оптимизируйте его.
  • Лучший способ проверить это. Профилируйте свой код.
  • Это может зависеть от браузера.
  • Это быстрее зависит от того, является ли переменная обычно верной или обычно ложной.
  • Сказав это, я бы предположил, что в большинстве сценариев установка переменной без тестирования будет быстрее.
+0

Согласовано. Я бы поместил свои деньги, просто изменив их на 100%, а не на 100% и изменив их на 50%. –

+0

@Mike M. и 50% - это предположение, что это может быть неверно - просто добавил. И я вижу, что cwap также сделал это. –

+1

Если «x» - это не просто переменная, но, например, «класс» или большой массив, было бы лучше проверить и затем установить. –

4

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

Если х == ложь 90% времени, то прямая присваивание х будет быстрее.

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

+0

+1 для размышлений о частоте ложных vs true. –

1

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

1

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

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

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

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

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


Ответ:

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

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