Pool [C++/résolu] - C++ - Programmation
Marsh Posté le 30-03-2006 à 17:50:54
> La STL ne te convient ?
aucune idée, j'ai pas essayé... quand j'ai vu __pool_allocator avec ``__`` j'ai pris peur!
mais je ne suis peut être pas tombé sur la bonne doc...
Marsh Posté le 30-03-2006 à 17:59:35
Dans la doc de boost:: object_pool, j'ai les temps suivants:
t.malloc() -> Amortized O(1),
t.free(p) -> O(N).
Je sais pas comment ils font leurs pools, mais l'algo que j'utilise est en O(1) (strict).
Même avec un pool dynamique, ça ne devrait pas dépasser O(lg(N))...
Marsh Posté le 30-03-2006 à 18:05:12
boost et STL sont optimisées pour ce genre de containers
http://www.sgi.com/tech/stl/
Marsh Posté le 30-03-2006 à 19:04:25
Tu est toujours là _darkalt3_?
jai essayé le test ci-dessus avec:
Code :
|
Mais c est horriblement lent:
* pool : 6.397160 sec. |
je my prends peut-être pas de la bonne façon...
Marsh Posté le 30-03-2006 à 19:43:14
ha ouais, c est pas ça, d'après le source std_allo.h c'est un algo en O(N) aussi.
ok, bon tant pis.
Marsh Posté le 31-03-2006 à 00:25:05
Bon, en ce qui concerne STL, l allocateur standard dont sont dérivés les autres possède les caractéristiques suivantes:
- algorithme en O(N/20),
- alloue 16 piles de 8 à 128 bytes
En ce qui concerne le premier point, ça rend l allocateur moins performant qu un new/delete.
En ce qui concerne le deuxième point, je doit gérer entre autre deux classes dont le sizeof est plus proche de 256 que de 128, ça ne me convient pas non plus.
Par contre jai trouvé la manière d utiliser les métadonnées de mon implémentation pour rendre le pool dynamique: allouer une pile deux fois plus grande à chaque fois, garder la pile en métadonnée. Comme les allocations atteignent un maximum je peut n être jamais obligé de désallouer ces piles.
L algo résultant est en O(lg(N)), et utilise 2 fois plus de mémoire temporaire, ce qui me convient. A vue de nez elle reste plus rapide que new/delete.
Merci pour ta participation _darkalt3_
Marsh Posté le 30-03-2006 à 17:41:52
Salut les C++eurs!
Je cherche à faire un pool d'objets.
Cas particulier d'utilisation:
Après recherches d'imlémentations & d'algos, j'ai concocté un code composé de deux classes template:
Un peu de code:
Après compilation gcc/linux, j'obtiens les temps suivants:
* pool : 6.397160 sec.
* new/del : 10.888527 sec.
Mais certains points ne me satifont pas:
Si vous avez des remarques ou des suggestions sur mon code, elles sont les bienvenues
Merci par avance !
Message édité par nargy le 31-03-2006 à 00:26:04