Почему 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);
}; // double comparison I will discuss later
//////////////////////////////////
};
};
};
Итак, я провел несколько тестов, изменив КОД ДЛЯ СРАВНЕНИЯ:

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

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.Может кто-нибудь это объяснить?

С флагом оптимизации -O3 я не вижу большой разницы для обеих версий.
Это около 0,780 секунды для обоих версий.
Кроме того, if (*i2 < 0) { *i2 = abs(*i2) кажется двойным (здесь имеется в виду дважды) сравнением, и его следует избегать, прямое выполнение *i2 = abs(*i2) все еще немного медленнее, чем Версия 1 без флага оптимизации.

Подробнее здесь: https://stackoverflow.com/questions/791 ... t-if-a-0-a
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему abs() из stdlib.h работает немного медленнее, чем просто if (a < 0) { a*= -1 }?
    Anonymous » » в форуме C++
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Почему Numpy Fabs намного медленнее, чем ABS?
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Почему Numpy Fabs намного медленнее, чем ABS?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Почему Numpy Fabs намного медленнее, чем ABS?
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Почему Numpy Fabs намного медленнее, чем ABS?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

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