Il y a quelques années, j'avais parlé ici d'un projet d'allocateur mémoire rapide pour TI. J'en ai eu besoin plus tard et l'ai donc achevé. Il compile et fonctionne sur Linux, mais il marche sans problème sur d'autres plateformes, tant que le compilateur est GCC (ou un équivalent fortement compatible tel que GCC4TI ou GTC).
Son utilité est discutable sur Linux, car le malloc de Linux est excellent. Sur Windows, je n'en sais rien... à tester par d'évenutelles personnes qui auraient besoin d'un allocateur rapide.
Sur TI, le gain est énorme.
D'une manière générale, s'il arrive à quelqu'un de programmer sur une plateforme qui ne dispose pas d'un gestionnaire de mémoire performant, voire d'aucun gestionnaire, peut-être ce travail lui rendra service.
- sur un Core2Duo à 3 GHz accompagné de DDR II à 800 MHz, il réalise par exemple 2.1 millions d'allocations/libérations par seconde (contre 2.5 pour le malloc de Linux).
- sur une TI à 12 MHz, il réalise par exemple 2000 allocations/libérations par seconde (contre moins de 100 pour le malloc du TIOS).
Ces performances varient avec le logarithme du nombre de zones libres, car les zones sont accédées par un arbre de tri auto équilibré (AVL pour les intimes). Il y a une heuristique sensée diminuer la fragmentation. Elle utilise des flottants (ralentissant à peine les opérations sur PC, mais très lents sur TI). Elle n'est pas présente dans la version destinée aux TI.
Voici ce qu'il faut savoir pour l'utiliser :
Décompresser l'archive et inclure tous les fichiers .c et .h dans votre projet.
Ecrire #include "fast_heap.h" en préambule des fichiers sources de votre programme où vous avez besoin de l'allocateur.
Son utilisation est très simple :
FastHeap *open_fast_heap (FHSize capacity)Fonction à appeler lors de l'initialisation de votre programme (ou à tout autre endroit, selon vos besoins).
Le paramètre capacity est la quantité de mémoire maximale que vous pourrez allouer, en octets. Soyez réaliste et juste, car cette quantité vous est réservée et devient indisponible pour le reste du système.
Il est possible de créer plusieurs allocateurs simultanés avec cette fonction.
void close_fast_heap (FastHeap *fast_heap)Détruit l'allocateur fast_heap créé avec la fonction précédente.
void *fast_alloc (FastHeap *fast_heap, FHSize size)Equivalent de malloc.
Le paramètre fast_heap est l'allocateur créé par la première fonction décrite ci-dessus. Le paramètre size est la taille du bloc que vous souhaitez allouer.
Renvoie NULL si la mémoire disponible n'est pas suffisante pour satisfaire votre demande.
void fast_free (FastHeap *fast_heap, void *user_address)Equivalent de free.
Le paramètre fast_heap est l'allocateur créé par la première fonction décrite ci-dessus. Le paramètre user_address est l'adresse du bloc à libérer.
L'allocateur : fast_heap.zip
Si quelqu'un a des suggestions (pour corriger des erreurs, pour réduire la fragmentation), c'est bienvenu. L'utilisation est libre de droits.