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

Рассмотрим цикл for, в котором при выполнении определенного условия вы хотите сохранить значение true в логическом значении:

b = false
for i in 1..N:
   if someCondition(i):
      b = true
   moreThatNeedsToBeDone(i)
endfor

Теперь рассмотрим тот же цикл for с OR EQUAL вместо

b = false
for i in 1..N:
   if someCondition(i):
      b |= true
   moreThatNeedsToBeDone(i)
 endfor

Если условие выполняется более одного раза, будет ли последнее быстрее в теории? Или, по крайней мере, будет меньше операций? В общем, OR EQUAL оценивает переменную, и если она истинна, то ничего не делает, следовательно, нет никакого дополнительного присваивания по сравнению с оператором EQUAL, где он будет ЗАХРАНИТЬ true несколько раз. Но, записывая это, я понимаю, что OR EQUAL в любом случае добавляет дополнительную операцию для оценки / чтения текущего значения переменной. Итак, что будет быстрее или потребует меньше операций?

0
Fabrice Dugas 25 Ноя 2018 в 18:59

1 ответ

Лучший ответ

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

Если компилятор будет переводить буквально, операция |= не будет включать в себя оценку переменной, чтобы узнать, следует ли выполнить операцию ИЛИ для значения или нет. Компилятор просто выдаст команду or, поскольку это будет эквивалентно и быстрее, чем первая проверка переменной (что может закончиться очисткой конвейера команд).

Без оптимизации сгенерированная сборка могла бы быть (ax - регистр процессора):

or ax,1  ; for b|=true

mov ax,1 ; for b=true

Я сомневаюсь, что на текущих процессорах это вообще влияет на скорость выполнения. Даже если бы это имело значение, мы говорим о такой предельной оптимизации по сравнению со временем загрузки из памяти в кеш на процессор / регистры или вместо переключатели потоков / переключатели процессов на ЦП или по сравнению с неверное предсказание ветвления в конвейерных микропроцессорах и т.п.

1
TT. 26 Ноя 2018 в 03:47