Я профилирование моего кода и оптимизированное вся, что мог, спустившись к функции, которая выглядит примерно так:Форсирование двойного абсолютного значения в C++
double func(double a, double b, double c, double d, int i){
if(i > 10 && a > b || i < 11 && a < b)
return abs(a-b)/c;
else
return d/c;
}
Это называется миллионы раз во время пробега программа и профилировщик показывает мне, что ~ 80% времени тратится на вызов abs()
.
я заменил
abs()
сfabs()
и он дал около 10% скорость вверх, не имеет большого смысла для меня, как я слышал несколько раз, что они идентичны для чисел с плавающей точкой иabs()
должны использоваться всегда. Это неверно, или я чего-то не хватает?Что было бы самым быстрым способом оценить абсолютное значение для двойника, которое могло бы еще улучшить производительность?
Если это важно, я использую g++
на linux X86_64.
Если IEEE, и вы хотите быть злым и эксплуатировать неопределенное поведение, вы можете попробовать «double x = a - b; * (uint64_t *) & x & = ~ (1ULL << 63); return x/c; ' –
Просто любопытно - это когда-либо равное b? –
@TonyD Предположим, нет, это не имеет значения для меня. – sashkello