2009-07-14 16 views
2

Je suis assez curieux de savoir comment Windows et Linux gère la mémoire avec les programmes C++.Windows, Linux et la gestion de la mémoire

La raison de cette curiosité est que je viens de faire 3 programmes très simples en C++ portable entre Linux et Windows. Le code était exactement le même. Le matériel aussi. Mais les résultats étaient incroyablement différents! Les deux tests ont été répétés 10 fois, puis la moyenne arithmétique a été calculée.

J'ai testé des insertions séquentielles sur un tableau statique d'entiers, sur le vecteur de classe et sur une pile (avec des pointeurs). Le nombre total d'insertions était de 10^6.

Windows XP SP2 résultats x86: tableau statique d'entiers: 56 ms vecteur de classe: 686 ms Stack (avec pointeurs): 2193 ms

Slackware 11 résultats x86: tableau statique d'entiers: 100 ms Vecteur de classe: 476 ms Pile (avec pointeur): 505 ms

La différence de vitesse entre le temps d'insertion de la pile sous Windows et Slax est impressionnante. Est-ce que ces résultats semblent normaux? Les deux codes ont été compilés en utilisant G ++ (mingw32-g ++ sous Windows).

L'ordinateur utilisé était un Dual Core 3.2Ghz avec 4 Go de RAM et lorsque les tests ont été effectués, il y avait plus de 2 Go de RAM libre.

+0

Ce n'est pas une question. (Astuce: Les questions se terminent généralement par un point d'interrogation "?"). – abelenky

+6

Je pense que la question est - pourquoi sont-ils si différents? –

+2

Ne "Est-ce que ces résultats semblent normaux?" qualifier? – jmanning2k

Répondre

6

Cela peut avoir plus à voir avec la mise en œuvre de stdlib C de (Microsoft MSVC vs. GNU libc/stdC++) que la gestion de la mémoire ...

C++ définit les spécifications, mais les mises en œuvre varient considérablement.

Mise à jour: Et comme je remarque maintenant que vous avez utilisé g ++ sur les deux plates-formes - eh bien, c'est encore une implémentation différente. Et le code GNU a été développé pour un environnement Unix, et a été porté sur Windows plus tard - il peut donc faire des suppositions et des optimisations qui sont incorrectes pour un environnement Windows.

Mais votre question d'origine est valide. Cela peut avoir quelque chose à voir avec le modèle de mémoire sous-jacent du système d'exploitation - mais vos tests ici sont trop grossiers pour tirer des conclusions.

Si vous exécutez d'autres tests ou si vous essayez d'utiliser des drapeaux/compilateurs différents, merci de poster quelques statistiques mises à jour, elles seront informatives.

+0

+1 vote ici. Et à Farofeiro, vous devriez essayer de compiler sur Windows en utilisant le compilateur MS, pas gcc. Il pourrait (mais juste pourrait) le rendre meilleur. –

+0

Ok, je peux essayer ça. Mais pourquoi devinez-vous que ça devrait être mieux? G ++ pour Windows n'est pas bien optimisé ou VS rend le code beaucoup plus optimisé pour Windows? –

1

Deux secondes pour un million d'insertions est un peu trop élevé. Avez-vous activé les optimisations? Sans eux, ces chiffres ne veulent rien dire. Editer: Comme vous avez compilé sans optimisations, activez-les (utilisez -O2 par exemple) et mesurez à nouveau. La différence sera probablement beaucoup plus petite. Les bibliothèques standard ont tendance à être assez défensives et à effectuer beaucoup de vérification de cohérence, ce qui peut fausser considérablement la mesure. Editer: Si cela prend encore plus de 2 secondes même si les optimisations sont activées, il se passe quelque chose d'autre. Essayez de poster du code. Le programme suivant tourne environ 40 millisecondes sur mon système sous cygwin.

#include <stack> 

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

Non, je n'ai activé aucun type d'optimisation. Mais la façon dont j'ai compilé la version de Windows était exactement la même que celle que j'ai faite pour Linux. –

+0

Ok, je viens de recompiler la version Windows et maintenant la pile fait les insertions 10^6 en 2121 ms. Il y a une réduction, mais la différence est encore très grande. J'ai compilé avec seulement le drapeau -O2 –

Questions connexes