6 votes

Performances lentes sur x64 gratuit

J'ai une classe comme ceci (supposons que toutes les allocations malloc réussissent)

class CMyClass
{
public:
  CMyClass()
  {
  lpData = malloc(128);
  };

  ~CMyClass()
  {
  free(lpData);
  };

public:
  LPVOID lpData;
};

ensuite j'exécute ceci:

CMyClass *lpList = new CMyClass[32768];

delete [] lpList;

Le problème est que sur x86 le code fonctionne bien et rapidement (quelques millisecondes pour terminer dans les versions debug et release) mais sur x64 l'appel delete prend environ 15 secondes pour libérer toute la mémoire.

Système d'exploitation: Win7 x64.

Des conseils seront appréciés.

Cordialement, Mauro.

7voto

MSN Points 30386

Il est possible que si vous exécutez votre application de test à travers un débogueur, vous rencontrez des problèmes de performance avec le tas de débogage de Windows. Ajoutez _NO_DEBUG_HEAP=1 aux paramètres de l'environnement pour le débogueur (dans les propriétés du projet->Propriétés de configuration->Débogage->Environnement sous Visual Studio 20xx) et voyez si cela améliore les performances de désallocation.

1voto

derobert Points 26258

J'ai juste testé cela moi-même, en utilisant gcc 4.6.1-1 sur Debian (après avoir ajouté typedef void *LPVOID). Il n'y a aucune différence; les deux s'exécutent instantanément, même sans aucune optimisation activée.

J'ai augmenté la longueur du tableau à 1048576 pour obtenir un temps d'exécution mesurable (0.161s), qui était le même pour IA32 et AMD64. J'ai activé les optimisations (-O3), et le temps est resté le même, mais est passé à 0.157s. -Os (optimisation pour la taille) a eu le même résultat.

Est-il possible que vous ayez utilisé des options de compilation différentes, comme peut-être avez-vous activé un type de débogage d'accès à la mémoire sur AMD64 ?

1voto

zvrba Points 14028

Soit vous diagnostiquez mal le problème, soit vous avez activé une vérification du tas. Je m'attendrais à de si mauvaises performances si chaque malloc/free appelait VirtualAlloc/VirtualFree, et si c'est le cas, vous avez activé le débogage de la mémoire d'une manière ou d'une autre.

0voto

Mark B Points 60200

Avez-vous essayé de profiler les deux versions pour voir s'il y a quelque chose d'évident ? Les tailles dans l'exemple sont-elles les tailles réelles ? Ma première supposition est que la version 64 bits nécessite (beaucoup) plus de mémoire et entraîne le système d'exploitation à thrasher, ce qui réduirait considérablement les performances.

0voto

Ajay Points 5320

J'ai exécuté le même code sur x64 Windows 7 SP1, version Release x64, VC10, SP1. Le x86 et le x64 se comportent exactement de la même manière.

Vous devez peut-être manquer quelque chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X