2016-05-27 9 views
0

Ich testete mein Programm und einmal entscheiden, BOOST_FOREACH Makros zu den einfachen for Zyklus mit const_iterator zu ändern.Wer ist schneller: BOOST_FOREACH Makros oder für

und ich erhalte unerwartetes Ergebnis: Programm arbeitet langsamer mit for.

Dann schrieb ich kleinen Test App:

std::vector<int> vec; 
for (int i = 0; i != 50000000; ++i) 
    vec.push_back(i); 



time_t t1 = clock(); 
int sum1 = 0; 
for (std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ++it) 
    sum1 += *it; 
std::cout << ulong(clock() - t1); 

time_t t2 = clock(); 
int sum2 = 0; 
BOOST_FOREACH(auto &it, vec) { 
    sum2 += it; 
} 
std::cout << ulong(clock() - t2); 

hier ausgegeben:

34963 
26964 

Warum so?

+1

geschieht Sie sollte es laufen viel mehr als ein Mal pro und es im Release-Modus laufen. –

+1

Probieren Sie es mit '-O3'-Optimierungsstufe aus (vermutlich ist dasselbe mit dem obigen Kommentar gemeint). Sie cachen auch 'vec.end()' in der ersten Schleife nicht – Smeeheey

+2

In solchen Fällen vergleichen Sie einfach generierte Assembly-Auflistungen. 99% sagt, dass das Ergebnis nach Optimierungen identisch sein wird – sehe

Antwort

5
  1. Sie haben ein undefiniertes Verhalten in Ihrem Code. Die Summe von 0 + ... + 50.000.000 liegt weit über MAX_INT. Ganzzahlüberlauf == undefiniertes Verhalten, undefiniertes Verhalten == Ihre Tests sind ungültig.

  2. Angenommen, Sie haben das Projekt mit vollständigen Optimierungen erstellt, vermute ich, dass die Ergebnisse aufgrund der CPU-Aufwärmphase passieren und aufgrund der Tatsache, dass im zweiten Benchmark einige der Daten bereits zwischengespeichert sind. Versuchen Sie, die benchmarkimg Tests Schalten und sehen, was