Улучшить производительность архивирования - PullRequest
1 голос
/ 22 декабря 2009

У меня есть проект с огромным количеством автоматически сгенерированного кода, который мы встраиваем в статическую библиотеку перед добавлением в конечный исполняемый файл. Мы используем gcc / gnat 5.04a. Существует так много файлов, что нам нужно разбить задание на пакеты и несколько раз вызвать ar для построения библиотеки (чтобы избежать ограничения длины командной строки), например:

 [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                   

Мы ищем потенциальные улучшения скорости. Похоже, что по мере роста архива каждый пакет занимает все больше и больше времени, предположительно потому, что у него есть что искать (для обновлений) перед добавлением объектов. Похоже, именно поэтому удаление архива делает это быстрее, чем просто обновление старого архива на месте. В нашем стремлении к большей скорости мы используем флаги "qcS" для команды ar. Согласно man-странице, «q» (который должен быть быстро добавлен) на самом деле является синонимом «r» (что означает «использовать замену»), «c» создает архив (ничего особенного там), и «S» пропускает создание индекса (который мы рассмотрим, снова используя в конце «ranlib».

Есть ли какой-нибудь удобный способ, используя встроенные инструменты, сделать эту операцию быстрее? Если бы работал режим «быстрого добавления», это, вероятно, было бы тем, что мы хотим, но увы.

1 Ответ

1 голос
/ 11 января 2010

Мы обнаружили, что огромной частью проблемы синхронизации было расположение архивируемых файлов. Числа выше относятся к объектным и архивным файлам, расположенным на устройстве NAS. Выполнение этой же операции на локальном жестком диске (временное хранилище) сокращает время до ~ 20-40 секунд. Копирование всех файлов, создание локального архива и копирование результатов обратно занимает больше времени, чем архивирование непосредственно на NAS, но мы планируем перенести весь процесс сборки в локальное временное хранилище, что должно существенно повысить производительность.

...