Давайте разберем его на несколько вопросов:
Может ли джиттер юридически изменить d / 1000.0
на d * 0.001
?
Нет, потому что эти два вычисления дают разные результаты. Помните, что числа с плавающей запятой - это двоичные, а не десятичные дроби; что 0,001 как двойное число точно не равно 1/1000 больше, чем 0,333333333 как двойное, точно равно 1/3. 0,001 - это ближайшая дробная часть к 1/1000, которая может быть выражена в 52 двоичных битах. И поэтому существуют такие значения, что x / 1000.0 не равен x * 0,001.
Может ли джиттер юридически изменить d / 2.0
на d * 0.5
?
Да. В этом случае значения могут быть представлены точно в двоичном виде, потому что 1/2 имеет небольшую степень два снизу.
Джиттер также может изменять целочисленные деления и умножения, такие как x / 2
или x * 2
на x >> 1
или x << 1
.
Действительно ли джиттер делает это, когда это законно?
Я не знаю. Попробуйте!
Вам нужно скомпилировать программу "retail", а затем запустить ее , а не в отладчике , и запускать ее до тех пор, пока вы не узнаете, что рассматриваемый код был присоединен. Затем присоедините отладчик и изучите приведенный код. Джиттер будет генерировать худший код, если он знает, что отладчик подключен, потому что он пытается сгенерировать код, который легче отлаживать.
Полагаю, либо оно того не стоит, либо они еще не добавили эту оптимизацию.
В случае деления на умножение вы предполагаете, что умножение происходит быстрее, чем деление. Современные чипсы чертовски хороши в обоих; хотя для деления обычно требуется больше битовых операций, возможно, разница незначительна.