// 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
, возможны даже лучшие идеи производительности.Поэтому, если производительность действительно важна, необходим окружающий код, иначе мы неправильно микрооптимизируем.