• [^] # Re: Structures non mutables performantes

    Posté par (site web personnel) . En réponse à la dépêche Sortie de GHC 8.2.1. Évalué à 2.

    Je suppose qu'en C++ la nécessité de recourir au weak_ptr doit venir du côté mutuellement récursif des deux type 'a t et 'a data.

    Cela vient du fait que que C++, les shared_ptr doivent être "clonés" à partir d'un précédant shared_ptr pointant vers le même objet, d'où le besoin de concerver cette information dans un weak_ptr. Dans une implémentation ou la gestion de la mémoire est assurée par un garbage collector traçant, le problème est tout autre, puisque pour cloner une "référence" vers soit, il suffit de cloner son adresse, et le GC traçant, lors de sa passe de recherche, trouvera qu'il existe plusieurs références vers la même adresse. Avec les avantages et inconvénients des deux méthodes : le shared_ptr n'a pas besoin d'un scan entier de la mémoire pour fonctionner.

    Je suis étonné qu'une copie complète soit plus rapide sur de petits vecteurs, j'aurais parié le contraire (je suis surtout étonné par l'écart de temps : 4 ms vs 30 ms)

    Copier un petit tas de pointeur, t'as toutes les chances que cela tombe dans une ligne de cache, donc en gros c'est assimilé à une unique lecture / écriture en RAM, ce qui est assez rapide. Cela doit sans doute venir de là.

    Néanmoins, le code de ta fonction update est « erroné »

    Oui, en effet, il est différent du tient, je t'avoue ne pas avoir recopié, mais implémenté from scratch en me basant sur ce que j'avais compris ;)

    C'est un compromis différent, plus "paresseux" puisque le reroot n'est fait qu'au moment de la lecture de la structure. Je ne pense pas que cela change grand chose au final.