Verwirrendes verhalten bei for-schleife
-
Hallo @all
std::array<std::array<unsigned char , 256>,14> q; for( int i = 0; i < 14; i++ ) for( int j = 0; j < 256; j++ ) q[i][j] = 't'; auto a = std::chrono::system_clock::now(); char c = 'A'; for( int m = 0; m < 30000000; m++ ) { for( const std::array<unsigned char,256>& t:q ) c = t[(unsigned char)c]; } auto b = std::chrono::system_clock::now(); cout << "Fertig\n" << std::chrono::duration_cast<std::chrono::milliseconds>( b - a ).count() << endl; a = std::chrono::system_clock::now(); c = 'A'; for( int m = 0; m < 30000000; m++ ) { for( int i = 0; i < 14; i++ ) c = q[i][(unsigned char) c]; } b = std::chrono::system_clock::now(); cout << "Fertig\n" << std::chrono::duration_cast<std::chrono::milliseconds>( b - a ).count();Folgender Code vergleicht die Laufzeit zweier Schleifen, welche exakt dasselbe tun. Die Erste nutzt die neue c++11 Schleife ( for( ... : ... ) ) , die Zweite nutzt die klassische "C" Schleife mit einer Laufvariable.
Wenn ich den Code ausführe, ist erstaunlicherweise die klassische for-schleife am Schnellsten!
Warum? Meine ganze Iteratoren-sind-toll-Welt ist heute zusammengebrochen!
mfG
shft
zu meinem Test:
Compiler: VS 2013 Community
Wichtige Einstellungen: Release , Optimierung: Disabled
erzeugter Code: 32-BitErgebnis (auf meinem Rechner):
c++11-Schleife: ~7 seks
C-Schleife: 2 seksDie anderen Schleifen-Arten:
Normales Iterieren ( for ( iterator it = ... ; it != end; it++) ): ~7 seks
Reverse Iterieren: ~ 25seks!!!!
-
bei mir (g++ 4.8.2, l*n*x) läuft die erste Schleife (3.8 Sek) schneller als die zweite (5.3 Sek)
-
Optimierung: Disabled
Niemand interessiert sich für die Laufzeit von unoptimiertem Code.
-
Unoptimiert ist die erste Version bei mir auch schneller, aber das interessiert wie SeppJ schon gesagt hat ja auch keinen.
Optimiert sind sind beide gleichschnell, was mich nicht weiter verwundert. Man muss natürlich davor dafür sorgen dass die Schleife nicht ganz rausoptimiert wird...
-
Die standardlibraries, zumindest die von VS verwendete, haben im debug-build eingebaute Laufzeit checks in den iteratoren.
-
Wenn ich volle Optimierung einstelle, sowie Geschwindigkeit bevorzugen, ist die 2.Version immernoch messbar schneller, also so 3-4 sekunden unterschied
-
Kann es vllt sein, dass trotz release trotzdem ausversehen die debug libs verwendet werden? Wenn ja, kann ich das im Linker ändern?
-
shft schrieb:
Kann es vllt sein, dass trotz release trotzdem ausversehen die debug libs verwendet werden? Wenn ja, kann ich das im Linker ändern?
Daran lag es!
Habe meine Runtime Lib auf Debug umgestellt gehabt (im Debug) wodurch sich natürlich die STL extrem verlangsamt hat ^^Sry für die Aufregung^^
-
* im Release