Версия 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;
};
////////////////////////////////
};
};
};
Версия 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);
};
Параметры компиляции — это просто 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