std::list::sort() - Pourquoi le passage soudain à une stratégie descendante ?
Dans Visual Studio 2015, le l'implémentation de std::list::sort() a subi un changement significatif du tri par fusion ascendant classique à un tri par fusion descendant. Ce changement a introduit une inefficacité apparente en exigeant que le point médian de la liste soit trouvé pour chaque niveau de récursion.
Raisons du changement :
Cependant, comme indiqué dans Avec la mise à jour fournie, Microsoft a effectué des optimisations pour préserver les correctifs de sécurité sans allocation de mémoire et les exceptions qui ont motivé le changement initial vers l'utilisation d'itérateurs. Plus précisément, l'implémentation récursive :
Comparaison avec le tri par fusion ascendante :
Malgré les optimisations, l'approche descendante peut toujours être plus lente que le tri par fusion ascendant lorsqu'il s'agit de listes chaînées volumineuses et dispersées en raison de l'augmentation des échecs de cache.
Implémentation alternative :
Une implémentation alternative est fournie qui conserve l'approche de tri par fusion ascendante tout en utilisant des itérateurs au lieu d'un tableau de listes. Cette approche vise à éviter les problèmes de performances liés à la nécessité de toujours trouver le point médian de la liste lors de la récursivité.
Conclusion :
Le passage à un tri par fusion descendant dans Visual Studio 2015 n’a pas été réalisé sur un coup de tête. Microsoft a mis en œuvre des optimisations pour remédier aux inefficacités potentielles, tout en conservant les avantages de la sécurité des exceptions et en réduisant l'allocation de mémoire. Cependant, pour les listes chaînées volumineuses et peu peuplées, une approche de tri par fusion ascendante peut toujours offrir de meilleures performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!