Программа должна суммировать два вектора. Даны две реализации.
Первая: на основе мета-программирования и классов:
struct Sum {
template <class T>
inline T operator()(const T &a, const T &b) const noexcept {
return a + b;
}
};
template <class FuncType>
struct Calc : public FuncType {
template <class T>
inline void operator()(std::vector<T> &result,
const std::vector<T> &a,
const std::vector<T> &b) const {
if (a.size() != b.size()) throw std::invalid_argument("vectors must have same size");
if (result.size() < a.size()) result.resize(a.size());
#pragma omp parallel for
for (size_t i = 0; i < a.size(); ++i) result[i] = FuncType::operator()(a[i], b[i]);
}
};
const static Calc<Sum> sum;
Вторая: прямая реализация
template <class T>
inline void direct_sum(std::vector<T> &result,
const std::vector<T> &a,
const std::vector<T> &b) {
if (a.size() != b.size()) throw std::invalid_argument("vectors must have same size");
if (result.size() < a.size()) result.resize(a.size());
#pragma omp parallel for
for (size_t i = 0; i < a.size(); ++i) result[i] = a[i] + b[i];
}
Вопрос, почему первый вариант (sum(v1,v2,v3)) медленнее чем второй (direct_sum(v1,v2,v3)) примерно на 10%? Предполагалось, что компилятор раскроет все inline выражения, и проседания по производительности быть должно.