Т.Л., д-р:double b=a-(size_t)(a)
быстрее, чем double b=a-trunc(a)
Является ли функция trunc очень медленной?
Я реализую функцию вращения для изображения, и я заметил, что функция trunc
, кажется, очень медленно.
Циклический код изображения, фактическое влияние пикселей закомментировано для теста производительности, поэтому я даже не получаю доступ к пикселям.
double sina(sin(angle)), cosa(cos(angle));
int h = (int) (_in->h*cosa + _in->w*sina);
int w = (int) (_in->w*cosa + _in->h*sina);
int offsetx = (int)(_in->h*sina);
SDL_Surface* out = SDL_CreateARGBSurface(w, h); //wrapper over SDL_CreateRGBSurface
SDL_FillRect(out, NULL, 0x0);//transparent black
for (int y = 0; y < _in->h; y++)
for (int x = 0; x < _in->w; x++){
//calculate the new position
const double destY = y*cosa + x*sina;
const double destX = x*cosa - y*sina + offsetx;
Так вот код, используя trunc
size_t tDestX = (size_t) trunc(destX);
size_t tDestY = (size_t) trunc(destY);
double left = destX - trunc(destX);
double top = destY - trunc(destY);
А вот и быстрее равноценные
size_t tDestX = (size_t)(destX);
size_t tDestY = (size_t)(destY);
double left = destX - tDestX;
double top = destY - tDestY;
Ответы предполагают не использовать trunc
при преобразовании обратно в интеграл, так что я тоже пытался в этом случае:
size_t tDestX = (size_t) (destX);
size_t tDestY = (size_t) (destY);
double left = destX - trunc(destX);
double top = destY - trunc(destY);
Быстрая версия, кажется, занимает в среднем 30 мс, чтобы пройти полное изображение (2048x1200), в то время как медленная версия с использованием trunc
занимает около 135 мс для того же изображения. Версия с двумя звонками до trunc
все еще намного медленнее, чем без (около 100 мс).
Насколько я понимаю правила C++, оба выражения должны возвращать всегда одно и то же. Я что-то упустил? dextX
и destY
объявлены const
, поэтому нужно сделать только один вызов функции trunc
, и даже тогда он не объяснит более чем в три раза более медленный коэффициент сам по себе.
Я с помощью Visual Studio 2013 с оптимизацией (/ O2). Есть ли причина использовать функцию trunc
? Даже для получения дробной части с использованием целого числа, кажется, быстрее.
'const' в C++ - это не то же самое, что' constexpr'. Можете ли вы разместить больше кода? – Dai
Ну, я не могу иметь их 'constexpr', потому что назначение меняется в цикле. Они только постоянны во время цикла. – meneldal