Beim Kompilieren des folgenden Codes
%Vor% Unter MinGW 4.8.1 dauert es ungefähr 2,5 Sekunden, um auf meiner Box ausgeführt zu werden. Das ist ungefähr die Zeit, die es dauert, die Funktion task
nur single-threadly auszuführen.
Wenn ich jedoch die Zeile in der Mitte auskommentiere und daher die Zeile vorher auskommentiere (das heißt, wenn ich die Reihenfolge tausche, in der d
und "(Help)"
in std::cout
geschrieben sind), dauert das Ganze jetzt 8-9 Sekunden.
Was ist die Erklärung?
Ich habe es erneut getestet und herausgefunden, dass ich nur das Problem mit MinGW-build x32-4.8.1-win32-dwarf-rev3
habe, aber nicht mit MinGW build x64-4.8.1-posix-seh-rev3
. Ich habe eine 64-Bit-Maschine. Mit dem 64-Bit-Compiler dauern beide Versionen drei Sekunden. Bei Verwendung des 32-Bit-Compilers bleibt das Problem bestehen (und liegt nicht an der Versionsverwechslung).
Es hat nichts mit Multithreading zu tun. Es ist ein Problem der Schleifenoptimierung. Ich habe den ursprünglichen Code neu angeordnet, um etwas Minimalistisches zu bekommen, das das Problem demonstriert:
%Vor%Wenn kompiliert und ausgeführt und mit:
%Vor%Die Ausgabe ist:
%Vor%Der größte Teil des Zeitunterschieds wird durch den für die innere Schleife generierten Assemblercode erklärt: Der schnelle Fall wird direkt in xmm0 akkumuliert, während der langsame Fall in xmm1 akkumuliert wird - was zu 2 extra movsd Anweisungen führt.
Wenn Sie jetzt mit der Option '-ftree-loop-linear' kompiliert werden:
%Vor%Die Ausgabe wird:
%Vor%Tags und Links c++11 concurrency mutex stdthread