lançamento do sistema de gerenciamento de pacotes , aplicada na distribuição . Este ramo concluiu um longo trabalho de transição para o Python 3 e a descontinuação do suporte ao Python 2.7.
Além da descontinuação do suporte ao Python 2.7, outra mudança importante foi a inclusão de , que permitiram acelerar em 50-60% os cálculos relacionados à definição de dependências. Curiosamente, alguns desenvolvedores sugeriram reescrever o código de resolução de dependências em C/C++ ou Go para acelerar seu funcionamento, mas a questão foi resolvida de forma mais simples.
A realização de um perfilamento do código existente mostrou que a maior parte do tempo durante os cálculos era gasta na chamada das funções use_reduce e catpkgsplit com um conjunto repetido de argumentos (por exemplo, a função catpkgsplit foi chamada de 1 a 5 milhões de vezes). Para acelerar, foi aplicado um cache dos resultados dessas funções utilizando dicionários. A função incorporada lru_cache foi considerada ideal para armazenar o cache, mas estava disponível apenas nas versões do Python a partir da 3.2. Para compatibilidade com versões anteriores, foi adicionada uma implementação alternativa que substituía o lru_cache, mas a decisão de descontinuar o suporte ao Python 2.7 no Portage 3.0 simplificou bastante a tarefa e eliminou a necessidade dessa camada adicional.
O uso do cache permitiu reduzir o tempo de execução da operação "emerge -uDvpU —with-bdeps=y @world" em um notebook ThinkPad X220 de 5 minutos e 20 segundos para 3 minutos e 16 segundos (63%). Testes em outros sistemas mostraram um aumento de desempenho não inferior a 48%.
O desenvolvedor que preparou a alteração também tentou implementar um protótipo do código de resolução de dependências em C++ ou Rust, mas a tarefa se revelou muito complexa, pois exigia a portabilidade de um grande volume de código, e, além disso, era duvidoso que o resultado justificasse o esforço investido.
Fonte: opennet.ru
