2009-07-14 32 views
2

Ich bin ziemlich neugierig, wie Windows und Linux Speicherverwaltung mit C++ - Programmen durchführt.Windows, Linux und Speicherverwaltung

Der Grund für diese Neugier ist, weil ich gerade 3 sehr einfache Programme in C++ portable zwischen Linux und Windows gemacht habe. Der Code war genau derselbe. Die Hardware auch. Aber die Ergebnisse waren unglaublich anders! Beide Tests wurden 10 mal wiederholt und dann wurde das arithmetische Mittel berechnet.

Ich habe sequentielle Insertionen auf einem statischen Array von ganzen Zahlen, auf dem Klassenvektor und auf einem Stapel (mit Zeigern) getestet. Die Gesamtzahl der Insertionen betrug 10^6.

Windows XP SP2 x86 Ergebnisse: Static Array von ganzen Zahlen: 56 ms Klassenvektor: 686 ms Stack (mit Zeiger): 2193 ms

Slackware 11 x86 Ergebnisse: Statische Array von ganzen Zahlen: 100 ms Klassenvektor: 476 ms Stapel (mit Zeiger): 505 ms

Der Geschwindigkeitsunterschied zwischen der Stapeleinfügungszeit unter Windows und Slax ist beeindruckend. Erscheint das Ergebnis normal? Beide Codes wurden mit G ++ kompiliert (mingw32-g ++ unter Windows).

Der verwendete Computer war ein Dual Core 3.2Ghz mit 4GB RAM und als die Tests gemacht wurden, gab es mehr als 2GB freien RAM.

+0

Dies ist keine Frage. (Hinweis: Fragen enden in der Regel mit einem Fragezeichen "?"). – abelenky

+6

Ich denke, die Frage ist - warum sind sie so verschieden? –

+2

Nicht "Erscheint das Ergebnis normal?" qualifizieren? – jmanning2k

Antwort

6

mit der stdlib Implementierung (Microsoft MSVC vs. GNU libc/STDC++) als Speicherverwaltung ++ C, mehr zu tun haben ...

C++ die Spezifikation legt, aber Implementierungen variieren

stark Dies kann.

Update: Und wie ich jetzt feststellen, dass Sie g ++ auf beiden Plattformen verwendet haben - nun, es ist immer noch eine andere Implementierung. Und der GNU-Code wurde für eine Unix-Umgebung entwickelt und später auf Windows portiert - so kann er Annahmen und Optimierungen treffen, die für eine Windows-Umgebung nicht korrekt sind.

Aber Ihre ursprüngliche Frage ist gültig. Es kann etwas mit dem zugrunde liegenden Speichermodell des Betriebssystems zu tun haben - aber Ihre Tests hier sind zu grob, um irgendwelche Schlussfolgerungen zu ziehen.

Wenn Sie mehr Tests ausführen oder versuchen, verschiedene Flags/Compiler zu verwenden, veröffentlichen Sie bitte einige aktualisierte Statistiken, diese wären informativ.

+0

+1 hier abstimmen. Und zu Farofeiro, sollten Sie versuchen, auf Windows mit MS-Compiler, nicht gcc zu kompilieren. Es könnte (aber nur könnte) machen es besser. –

+0

Ok, ich kann das versuchen. Aber warum denkst du, es sollte besser sein? G ++ für Windows ist nicht gut dafür optimiert oder VS macht Code viel besser für Windows optimiert? –

1

Zwei Sekunden für eine Million Insertionen ist ein wenig zu hoch. Haben Sie Optimierungen aktiviert? Ohne sie bedeuten diese Zahlen nichts.

Bearbeiten: Da Sie ohne Optimierungen kompiliert haben, aktivieren Sie sie (verwenden Sie beispielsweise -O2) und messen Sie erneut. Der Unterschied wird wahrscheinlich viel kleiner sein. Die Standardbibliotheken neigen dazu, ziemlich defensiv zu sein und eine Vielzahl von Konsistenzprüfungen durchzuführen, was die Messung stark verzerren kann.

Edit: Wenn es noch 2 Sekunden dauert, selbst wenn die Optimierungen aktiviert sind, ist da noch etwas los. Versuche etwas Code zu posten. Das folgende Programm läuft auf meinem System unter cygwin ungefähr 40 Millisekunden.

#include <stack> 

int main() 
{ 
    std::stack<int> s; 
    for (int i = 0; i < 1000000; ++i) 
     s.push(i); 
} 
+0

Nein, ich habe keine Optimierungen aktiviert. Aber die Art, wie ich die Windows-Version kompiliert habe, war genauso, wie ich die Linux-Version kompiliert habe. –

+0

Ok, ich habe gerade die Windows-Version neu kompiliert und jetzt macht der Stack die 10^6 Einfügungen in 2121 ms. Es gibt eine Reduktion, aber der Unterschied ist immer noch sehr hoch. Ich habe nur mit -O2-Flag kompiliert –