la version du système de gestion des paquets , utilisé dans la distribution . La branche présentée a tiré le bilan d'un long travail de transition vers Python 3 et de l'arrêt du support de Python 2.7.
En plus de l'arrêt du support de Python 2.7, un autre changement important a été l'inclusion , permettant d'accélérer les calculs liés à la détermination des dépendances de 50 à 60%. Il est intéressant de noter que certains développeurs ont proposé de réécrire le code de résolution des dépendances en C/C++ ou Go pour en accélérer le traitement, mais le problème a pu être résolu de manière relativement simple.
La profilage du code existant a montré que la majorité du temps lors des calculs était consacrée à l'appel des fonctions use_reduce et catpkgsplit avec un ensemble d'arguments répété (par exemple, la fonction catpkgsplit a été appelée entre 1 et 5 millions de fois). Pour accélérer le processus, il a été utilisé la mise en cache des résultats de ces fonctions grâce à des dictionnaires. La fonction intégrée lru_cache était optimale pour le stockage en cache, mais elle n'était disponible que dans les versions de Python à partir de 3.2. Pour assurer la compatibilité avec les versions antérieures, une ébauche remplaçant lru_cache a été ajoutée, mais la décision d'arrêter le support de Python 2.7 dans Portage 3.0 a grandement simplifié la tâche et a permis de se passer de cette couche intermédiaire.
L'utilisation du cache a permis de réduire le temps d'exécution de l'opération « emerge -uDvpU —with-bdeps=y @world » sur un ordinateur portable ThinkPad X220 de 5 minutes 20 secondes à 3 minutes 16 secondes (63%). Des tests sur d'autres systèmes ont montré un gain de performance d'au moins 48%.
Le développeur ayant préparé la modification a également tenté de réaliser un prototype du code de résolution des dépendances en C++ ou Rust, mais la tâche s'est révélée trop complexe, car elle nécessitait le portage d'un volume considérable de code, et il était douteux que le résultat obtenu justifie les efforts fournis.
Source : opennet.ru
