2010-03-04 5 views
2

Existe-t-il un modèle pour gérer un grand nombre d'instanciations d'objets (40 Ko par seconde) sur un appareil mobile? J'ai besoin de ces objets séparément et ils ne peuvent pas être combinés. Une réutilisation d'objets serait probablement une solution. Des indices?Importante quantité de création d'objets en C++

+0

C++ et iPhone? Êtes-vous sûr? Objective-C et iPhone? C++ et symbian? –

+0

@Tadeusz - Objective-C peut très bien s'interfacer avec C++, il est donc assez simple de coder en C++ pour l'iPhone. –

+0

@Tafeusz: Oui, je veux dire C++. Le code hérité est souvent écrit en C++, ce qui fonctionne parfaitement sur l'iPhone. – Sney

Répondre

7

Oui. Gardez les objets anciens dans une piscine et réutilisez-les, si vous le pouvez. Vous économiserez beaucoup de temps en raison du coût de l'allocation et de la suppression de la mémoire.

2

Si les objets sont de la même taille, essayez simple allocateur de cellule avec une liste chaînée intrusive des nœuds libres:

free: 
    add node to head of list 

allocate: 
    if list is non-empty: 
     remove the head of the list and return it 
    else: 
     allocate a large block of memory 
     split it into cells of the required size 
     add all but one of them to the free list 
     return the other one 

Si l'allocation et la libération sont tous fait dans un seul fil, alors vous n » t besoin de synchronisation. S'ils sont faits dans différents threads, puis éventuellement contexte 40k passe par seconde est une plus grande inquiétude que 40k allocations par seconde ;-)

Vous pouvez faire les cellules juste être « mémoire brute » (et, soit le placement d'une utilisation nouvelle ou surchargez l'opérateur new pour votre classe), ou bien gardez les objets initialisés à tout moment, même quand ils sont sur la "liste libre", et assignez les valeurs dont vous avez besoin aux membres des "nouveaux". Ce que vous faites dépend de l'importance de l'initialisation, et c'est probablement la différence technique entre un allocateur de cellule et un pool d'objets.

1

Difficile de dire exactement comment améliorer votre code sans plus d'informations, mais vous voulez probablement vérifier les bibliothèques Boost Pool. Ils fournissent tous différents moyens d'allouer rapidement la mémoire pour différents cas d'utilisation spécifiques. Choisissez celui qui correspond le mieux à votre cas d'utilisation.

0

Si les objets sont de la même taille, vous pouvez affecter une grande partie de la mémoire et d'utiliser placement new, qui aidera le coût allocation car il seront tous en mémoire contiguë:

Object *pool = malloc(sizeof(Object) * numberOfObjects); 
for(int i=0; i<numberOfObjects; i++) 
    new (&pool[i]) Object() 
0

J'ai utilisé des modèles similaires pour les systèmes réaction de diffusion stochastique de programmation (en millions de créations d'objets par seconde sur un ordinateur de bureau) et pour l'image en temps réel traitement (encore une fois, des centaines de milliers ou des millions par seconde).

L'idée de base est la suivante:

  • Créer un allocateur qui alloue des tableaux de votre objet désiré; exige que cet objet ait un pointeur "suivant" (je crée généralement un modèle qui enveloppe l'objet avec un pointeur suivant).
  • Chaque fois que vous avez besoin d'un objet, obtenez-en un à partir de cet allocateur (en utilisant la nouvelle syntaxe qui s'initialise à partir du bloc de mémoire que vous appelez).
  • Chaque fois que vous avez terminé, remettez-le à l'allocateur et placez-le sur une pile.
  • L'allocateur vous donne quelque chose de la pile si la pile n'est pas vide, ou quelque chose de son tampon de tableau dans le cas contraire.Si vous n'avez plus de tampon, vous pouvez soit allouer un autre tampon plus important et copier les nœuds existants, soit laisser l'allocateur gérer une pile de blocs d'allocation entièrement utilisés.
  • Lorsque vous avez terminé avec tous les objets, supprimez l'allocateur. Bénéfice secondaire: vous n'avez pas besoin d'être sûr de libérer chaque objet individuel; ils vont tous s'en aller. Coût latéral: vous feriez mieux d'allouer tout ce que vous voulez conserver pour toujours sur le tas plutôt que dans ce tampon temporaire (ou d'avoir un tampon permanent que vous utilisez).

En général, j'obtiens des performances d'environ 10 fois supérieures à celles du format malloc brut/nouveau lors de l'utilisation de cette approche.

2

Vous pouvez utiliser le modèle de masse volumique si vos objets sont redondants. Ce motif partage la mémoire entre des objets similaires. L'exemple classique est la structure de données utilisée pour la représentation graphique des caractères dans un programme de traitement de texte.

Wikipédia a un summary.

Il y a un implementation en boost.