OpenCL
uint abs(int x)
{
return bitselect((x>(-x)),-x,x);
}
Поне при AMD видеокарти обаче, това е безкрайно безсмислено. Там самата архитектура е направена с идеята за abs(). Всяка integer инструкция има modifiers на входните операнди, един от тях е да вземе абсолютната стойност. Това става без performance penalty. Гореописаният код е дооооста по-бавен, отколкото да ползваш abs().
хайде сега да сметнете кое е по-бързо abs() или функцииката, която сте забъркали, като същевременно
си пеете песента на Дони и Момчил - "На кой му трябва това"
По принцип е така. Като изключим елемента на човъркането (който е тоооолкова присъщ на линукс-хората), все пак мисля, че има ограничена практическа полза, когато гониш performance. Примерно аз съм виждал memcmp() имплементация, която работи по-бързо стига данните да са aligned и същата ми е свършила добра работа с password cracking глупостите. memcmp() по принцип не може да прави такива предположения и трябва да проверява. Ако двата региона памет, които сравняваш ти почват от адрес в паметта, кратен на 8 (на 64-битова архитектура) и имат дължина кратна на 8 (или си убеден че са pad-нати с нулеви байтове), можеш да кастваш към unsigned long long и да сравняваш и това е по-бързо по разбираеми причини. Не винаги компилатора и стандартните библиотеки ти осигуряват максимална производителност. И не винаги се налага да прибягваш до дивотии от сорта на inline assembly, за да изстискаш каквото може