2009-01-23 25 views
26

J'ai joué avec boost :: pool quelques fois dans des endroits où il me semblait que je martelais sérieusement le tas avec beaucoup d'objet "baratte". En général, j'ai utilisé boost::object_pool ou boost::pool_alloc comme paramètre de modèle STL. Cependant, le résultat est invariablement que la performance est pratiquement inchangée, ou considérablement aggravée.Avez-vous déjà obtenu une accélération significative en utilisant boost :: pool?

Je suis curieux d'entendre des histoires de succès avec elle.

Quel genre de choses dois-je rechercher dans la sortie de profilage qui pourrait indiquer que boost :: pool est susceptible d'aider?

Est-il vraiment difficile d'améliorer le bon vieux malloc?

Répondre

20

pools de mémoire sont imo plus efficaces pour le traitement de style de transaction où vous pouvez allouer à la piscine, puis lorsque la transaction est faite, juste le jeter dans l'oubli. La vraie accélération n'est pas que chaque allocation va être beaucoup plus rapide et que vous aurez une fragmentation de la mémoire proche de zéro dans une application extrêmement longue.

En sorte, il semble que vos applications ne justifient pas l'utilisation de pools de mémoire

+0

Eh bien, celui-ci a effectivement répondu à la question (bien que je suis certainement coupable d'optimisation prématurée dans ce cas, comme indiqué par les autres réponses). – timday

3

Vous voudrez peut-être localiser vos problèmes de performance dans les allocations de mémoire avant de commencer à optimiser pour cela. Donc, affinez votre profilage pour identifier l'emplacement du problème. Cela peut être beaucoup d'appels au même code qui pourrait ne pas prendre longtemps quand seulement appelé une fois.

10

Les optimisations de stores ne sont pas bonnes. Essayez d'utiliser google allocateur de mémoire, vous n'avez même pas besoin de recompiler votre application. Vous pouvez trouver ce que vous devez savoir ici:

http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html

Gaetano

+0

Merci pour le pointeur. Une des choses avec lesquelles je jouais était des pools de mémoire spécifiques au thread, mais tcmalloc semble être un moyen plus simple de les obtenir. – timday

16

Oui, 500% d'augmentation de la vitesse. L'application (plutôt bêtement, mais parfois vous devez travailler avec ce que vous avez) copiait les éléments de 1 std :: map dans une autre (il y avait une prise de décision dans la boucle), et les allocations résultantes sur les serveurs multithread/process a entraîné des conflits de tas. J'ai ajouté le pool de boost comme un allocateur sur la deuxième carte et le résultat a été une augmentation de 500% de la vitesse d'exécution de l'application.