Почему abs() из stdlib.h работает немного медленнее, чем просто if (a < 0) { a*= -1 }?C++

Программы на C++. Форум разработчиков
Anonymous
Почему abs() из stdlib.h работает немного медленнее, чем просто if (a < 0) { a*= -1 }?

Сообщение Anonymous »

Я разрабатывал эту функцию для преобразования всех отрицательных значений из матричного вектора в положительные значения:
Версия 1 >:

Код: Выделить всё

template  void abs_matrin(std::vector &x) {
typename std::vector::iterator i2;
for (typename std::vector::iterator i = x.begin(); i != x.end(); ++i) {
for (i2 = i->begin(); i2 != i->end(); ++i2) {
#### CODE TO BE COMPARED ###
if (*i2 < 0) {
*i2 *= -1;
};
############################
};
};
};
А затем я протестировал с помощью abs() из stdlib.h, думая, что это будет быстрее.
Версия 2:

Код: Выделить всё

#include 
template  void abs_matrin(std::vector &x) {
typename std::vector::iterator i2;
for (typename std::vector::iterator i = x.begin(); i != x.end(); ++i) {
for (i2 = i->begin(); i2 != i->end(); ++i2) {
#### CODE TO BE COMPARED ###
if (*i2 < 0) {
*i2 = abs(*i2);
};
############################
};
};
};
Итак, я провел несколько тестов, изменив КОД ДЛЯ СРАВНЕНИЯ:

Код: Выделить всё

for (int i = 0; i < 10000000; ++i) {
std::vector matr = {{-11, -2, -3}, {-4, -165, -1116}, {-7, 8, 9}};
abs_matrin(matr);
};
И оказывается, что с gcc14.2.1 и gcc17 Версия 1 значительно быстрее во время выполнения чем второй но не знаю почему. На моем компьютере это занимает примерно 7,420 секунд для Версии 1 и 7,770 секунд для Версии 2. Я запускал тесты несколько раз, и результаты всегда были одни и те же.
Параметры компиляции — это просто g++ file.cpp.Может кто-нибудь это объяснить?
Я новичок в C++, поэтому не могу объяснить разницу.
Заранее спасибо
Изменить
С флагом оптимизации -O3 я не вижу большой разницы для обеих версий.
Это около 0,780 секунды для обеих версий.

Подробнее здесь: https://stackoverflow.com/questions/791 ... t-if-a-0-a

Вернуться в «C++»