Melhore o desempenho do arquivamento de ar
-
21-09-2019 - |
Pergunta
Tenho um projeto com uma enorme quantidade de código gerado automaticamente, que construímos em uma biblioteca estática antes de vincular ao executável final.Usamos gcc/gnat 5.04a Existem tantos arquivos que temos que dividir o trabalho em lotes e invocar ar várias vezes para construir a biblioteca (para evitar a limitação de comprimento da linha de comando), por exemplo:
[echo] Archiving codegen
[echo] Deleting old codegen archive
[ar] Using ar found in /usr/bin
[ar] Batch 1 of 7 completed in 37.871 s
[ar] Batch 2 of 7 completed in 55.796 s
[ar] Batch 3 of 7 completed in 89.709 s
[ar] Batch 4 of 7 completed in 256.894 s
[ar] Batch 5 of 7 completed in 196.704 s
[ar] Batch 6 of 7 completed in 248.334 s
[ar] Batch 7 of 7 completed in 243.759 s
[ar] Archiving took: 1129.067 s
[ar] Using ranlib found in /usr/bin
[ar] Indexing took: 247.223 s
[echo] Done with codegen
Estamos procurando possíveis melhorias de velocidade.Parece que, à medida que o arquivo cresce, cada lote leva cada vez mais tempo, presumivelmente porque tem mais para pesquisar (por atualizações) antes de adicionar objetos.Parece ser por isso que a exclusão do arquivo torna tudo mais rápido do que apenas atualizar o arquivo antigo.Em nossa busca por mais velocidade, usamos os sinalizadores “qcS” no comando ar.De acordo com a página de manual, "q" (que deve ser anexado rapidamente) é na verdade um sinônimo de "r" (que é "usar substituição"), "c" cria o arquivo (nada de especial aí) e "S" pula gerando um índice (que abordamos usando "ranlib" novamente no final.
Existe alguma maneira conveniente, usando ferramentas integradas, de tornar essa operação mais rápida?Se o modo "anexação rápida" funcionasse, provavelmente seria o que queremos, mas, infelizmente.
Solução
Descobrimos que grande parte do problema de tempo era a localização dos arquivos arquivados.Os números acima são para arquivos de objetos e arquivos localizados em um dispositivo NAS.Fazer a mesma operação em um disco rígido local (armazenamento temporário) reduz o tempo para aproximadamente 20 a 40 segundos.Copiar todos os arquivos, arquivar localmente e copiar o resultado leva mais tempo do que arquivar diretamente no NAS, mas estamos pensando em mover todo o nosso processo de construção para armazenamento temporário local, o que deve melhorar substancialmente o desempenho.