Модуль (Поплавок) против Ветви - PullRequest
0 голосов
/ 16 ноября 2018

Учитывая 2 выражения, которые делают то же самое ([-3.14, 3.14] -> [0, 6.28]):

a > 0? a : a + 6.28

или

fmod(a + 6.28, 6.28)

Есть ли общая разница в производительности?

Edit: Предположим, такое выражение вызывается много раз (так, чтобы производительность была релевантной), и что вход a каждый раз отличается. (Чтобы вопрос был более прямолинейным).

1 Ответ

0 голосов
/ 16 ноября 2018
// Tertiary
t = a > 0? a : a + 6.28
// vs fmod
m = fmod(a + 6.28, 6.28)

Есть ли общая разница между двумя показателями в производительности?

Конечно, профилирование лучше @ NathanOlive , но в качестве общего руководства рассмотримпотенциал оптимизации.

Компилятор обычно оптимизирует во всем диапазоне типа a, а не [-3.14, 3.14].t, простой расчет, легко оптимизируемый.

Далее, в зависимости от FLT_EVAL_METHOD , в C, m вычисление переводится в double и, конечно, в вызов функции.Чем больше ограничений, тем меньше возможностей для оптимизации.t может использовать оптимальную ширину FP.

Рекомендовать a > 0 ? a : a + 6.28 в качестве общего предпочтительного подхода.


Учитывая 2 выражения, которые делаютто же самое

Но они не делают то же самое для домена [-3.14, 3.14]

Около 1/4 всех double находятся в диапазоне [0 ... 1,0].m использование a + 6.28 приведет к потере как минимум от 3 до всех битов точности с этим дополнением.Преимущество: t.

Диапазоны отличаются:
Диапазон t равен [0, 6.28]
Диапазон m равен [0, 6.28), а не [0,6.28]


Рассмотрение более высокой цели

Очевидно, что код пытается уменьшить тригонометрический диапазон.Сделать это хорошо сложнее, чем основной синус.косинус, сам касательный расчет.См. СНИЖЕНИЕ АРГУМЕНТОВ ДЛЯ ОГРОМНЫХ АРГУМЕНТОВ: «Хорошо до последнего бита» .

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


Увеличенное изображение

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

...