nraynaud lol | lorill a écrit :
1) Le probleme, c'est que les deux points vont ensemble. Tant que j'ai un GC que je ne maitrise pas, je peux difficilement me baser dessus. C'est quoi l'inconvénient du conservatif au fait ?
2) Tu peux préciser ? je vois pas de quoi tu parles.
3) C'est du au fait que j'utilise mes types directement dans Object. Par exemple, un object a la méthode clone. Donc si je mets cette méthode dans object, j'instancie un objet Method, un StringTable, et pas mal de String. L'objet Method a une méthode clone, donc on recommence, et ca s'arrete jamais. L'idée c'est donc d'instancier les attributs le plus tard possible, c'est a dire au moment ou on accède a la table des attributs.
4) et merci d'avoir passé du temps a regarder mon projet, ca fait toujours plaisir !
|
Je pense qu'il faudrait soit ouvrir un thread soit passer par mail mais on est loin de la théorie là, on est dans le camboui.
J'ai numéroté tes paragraphes pour suivre.
1) Le conservatisme c'est le fait de ne pas déplacer un objet en mémoire, Il est dû dans ton cas au fait qu'en C rien ne ressemble plus à un pointeur qu'en mot de 32 bits. Comme tu ne peux pas déplacer tes objets, ta mémoire se fragmente, ton allocateur est plus complexe (genre un "first-fit" ), et tu consomes une tonne de mémoire.
2) boxer un type primitif, c'est lui mettre une "coquille" pour l'adapter au langage, ça vaut dire qu'au moment d'être utilisé par le proc, il faudra le "déboxer" (le sortir de sa coquille). Comme c'est sur des types primitifs, tu passes ta vie à boxer et à déboxer mais tu fais pas grand'chose d'utile dans ton programme. C'est pourquoi, il existe des techniques (bidouilles) pour éviter le boxing. Regarde O'Caml, il y a des entier 32 bits lents et des entiers 31 bits rapides, c'est toute la différence.
petite démo :
http://www.lucane.org/cgi-bin/view [...] cvs-markup
Code :
- LuInteger * LuInteger_abs(LuInteger * self)
- {
- mpz_t absValue;
- mpz_init(absValue);
- mpz_abs(self->value, absValue);
- return LuInteger_create(mpz_get_str(0, 0, absValue));
- }
|
Et le moins qu'on puisse dire c'est que LuInteger_create est coûteuse derrière. C'est la phase de Boxing.
3) J'ai pas tout compris mais ça a une tête de lazy. Quel est l'intérêt de copier l'attribut ? |