Il seguente codice mostra una grande differenza di prestazioni delle due versioni di min_3
sulla mia macchina (Windows 7, VC++ 2015, versione).massimo di 3 valori, prestazioni della versione associativa a sinistra rispetto alla versione associativa a destra
#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
template <typename X>
const X& max_3_left(const X& a, const X& b, const X& c)
{
return std::max(std::max(a, b), c);
}
template <typename X>
const X& max_3_right(const X& a, const X& b, const X& c)
{
return std::max(a, std::max(b, c));
}
int main()
{
std::random_device r;
std::default_random_engine e1(r());
std::uniform_int_distribution<int> uniform_dist(1, 6);
std::vector<int> numbers;
for (int i = 0; i < 1000; ++i)
numbers.push_back(uniform_dist(e1));
auto start1 = std::chrono::high_resolution_clock::now();
int sum1 = 0;
for (int i = 0; i < 1000; ++i)
for (int j = 0; j < 1000; ++j)
for (int k = 0; k < 1000; ++k)
sum1 += max_3_left(numbers[i], numbers[j], numbers[k]);
auto finish1 = std::chrono::high_resolution_clock::now();
std::cout << "left " << sum1 << " " <<
std::chrono::duration_cast<std::chrono::microseconds>(finish1 - start1).count()
<< " us" << std::endl;
auto start2 = std::chrono::high_resolution_clock::now();
int sum2 = 0;
for (int i = 0; i < 1000; ++i)
for (int j = 0; j < 1000; ++j)
for (int k = 0; k < 1000; ++k)
sum2 += max_3_right(numbers[i], numbers[j], numbers[k]);
auto finish2 = std::chrono::high_resolution_clock::now();
std::cout << "right " << sum2 << " " <<
std::chrono::duration_cast<std::chrono::microseconds>(finish2 - start2).count()
<< " us" << std::endl;
}
uscita:
left 739861041 796056 us
right 739861041 1442495 us
Sulla ideone la differenza è più piccola ma comunque non trascurabile.
Perché esiste questa differenza?
Provare a confrontare l'output di assieme dei compilatori. –
Risultati simili su g ++ 5.2.1 -O2 –
hai provato a calcolare prima a destra e poi a sinistra e vedere se il tempo rimane lo stesso? – Krishna