2012-11-27 12 views
6

Dieser Code dauert etwa 20 Sekunden in meinem VS2012, aber nur 1.x Sekunden in G ++. Beide in Win8 x64 und mit Standardoptionen kompiliert.Warum list :: push_back viel langsamer in VC++ als g ++?

list<double> items; 
for(int i=0;i<10000000;i++){ 
    items.push_back(rand()); 
} 
cout<<"done"<<endl; 

Geht es um Speicherzuweisung? Es dauert 3 ~ 5 Sekunden, um den Speicher nach der Ausgabe in VC++ auf meinem Rechner freizugeben, und sogar mehr als 1 Minute in meinem Firend (win7 x64).

+22

Ich bin nicht sicher, was die Standard-Build-Konfiguration für G ++ ist, aber für Visual Studio ist es ** DEBUG ** und Sie möchten die Leistung der Debug-Builds nicht vergleichen – emartel

+0

Wie kompiliert man mit Release in VS und -O2 Option mit gcc? – nhahtdh

+1

haben Sie versucht, 'items.reserve (10000000)' direkt vor der Schleife zu machen? –

Antwort

12

Hmm ... erweiterte ich den Code Timing enthalten:

#include <list> 
#include <iostream> 
#include <time.h> 
#include <stdlib.h> 

int main() { 
    std::list<double> items; 

    clock_t start = clock(); 

    for(int i=0;i<10000000;i++){ 
     items.push_back(rand()); 
    } 

    clock_t finish = clock(); 

    std::cout << "Time: " << double(finish-start)/CLOCKS_PER_SEC << "\n"; 
    return 0; 
} 

ich mit VC++ kompiliert mit: cl /O2b2 /GL test_list.cpp

Ebenso ich mit g ++ kompiliert, mit: g++ -O3 test_list.cpp

ich dann lief die zwei.

Mit VC++ habe ich: Time: 1.293.
Mit g ++ habe ich: Time: 1.313.

, dass ein kleinen genug Unterschied ist, dass ich glaube, ich brauche würde ziemlich viel mehr zu testen, überhaupt sicher zu sein, VC zu sagen ++ produziert deutlich schneller Code, aber ich denke, es ist genug eine Schlussfolgerung, dass VC++ ist die Unterstützung nicht produziert deutlich langsamer code.

Sie müssen die Optimierung einschalten, damit die Ergebnisse der Zeitmessung alles bedeuten.

+0

Danke. Mein Code ist fast so. Das Problem ist die DEBUG-Kompilierungsoption. – raulchen

+4

@raulchen Debugging ist * langsam *, damit es debugged * werden kann. – Mysticial

+2

@Mystical Was Debuggen bedeutet * bedeutet, wählen Sie "verrauschte" Fehler, um den Entwickler über ein mögliches Problem zu informieren, anstatt eine für die Feldbereitstellung geeignete Handhabung durchzuführen. 99% der Zeit wird dies langsamer sein, aber ein Release-Build ist sicherlich frei, auf eine unerwartete Bedingung in einer Weise zu reagieren, die langsamer ist. Ich erwähne teilweise, weil ich eigentlich * glaube nicht an die Debug/Release-Unterscheidung * (!), Behaupten, oder verifizieren: http://hostilefork.com/hoist/ – HostileFork

-4

Wenn Sie unter Windows arbeiten und sich um die Leistung sorgen, verwenden Sie keine STL-Container. Funktional äquivalente ATL-Container-Klassen sind in der Regel viel schneller.

Auf meinem Laptop (i5-2410M CPU, Windows 7 64) wird Ihr Beispiel (wenn es in Release mit Visual Studio 2010 für 64 Bits kompiliert wurde) in 740 Millisekunden ausgeführt. Bei Verwendung des funktional äquivalenten ATL-Containers CAtlList<double> fällt die Ausführungszeit auf nur 370 Millisekunden.

Die Leistungseinbußen bei der Verwendung von Standardbibliotheken betragen im Vergleich zu Premiumbibliotheken von Microsoft etwa 50%.

Hier ist der Quellcode:

void list_stl() 
{ 
    std::list<double> items; 
    CBenchmarkTimer tt("10M doubles in std::list"); 
    for(int i = 0; i < 10000000; i++) 
     items.push_back(rand()); 
    tt.End(); 
} 

void list_atl() 
{ 
    CAtlList<double> items; 
    CBenchmarkTimer tt("10M doubles in CAtlList"); 
    for(int i = 0; i < 10000000; i++) 
     items.AddTail(rand()); 
    tt.End(); 
} 

CBenchmarkTimer meine eigene Klasse ist, die hochauflösende Timer verwendet.

+1

Ich bezweifle, dass sie funktional gleichwertig sind, wenn es so viel schneller ist, aber ich bezweifle auch, dass es so viel schneller ist ... –

+3

Wie genau ist die C++ Standardbibliothek "Open Source"? – fredoverflow

+0

@MooingDuck, Ich habe den Quellcode hinzugefügt - wenn Sie Zweifel haben, fühlen Sie sich frei, sich selbst zu testen. Und ja, sie sind funktional gleichwertig, siehe die Dokumentation zu CAtlList. – Soonts

Verwandte Themen