28 мая 2016г.
Рассмотрено влияние компоновщиков на общее время компиляции программ. Показано, что Google gold компонует файлы минимум в два раза быстрее GNU ld вне зависимости от размера результирующего исполняемого файла. При этом на примере большого программного продукта, состоящего из порядка 200 библиотек и исполняемых файлов, реализованных на языке С++ в примерно 6000 файлах с исходным кодом суммарным размером около миллиона строк, экспериментально установлено, что при компиляции всех исходных файлов проекта использование компоновщика Google gold позволяет уменьшить общее время компиляции не более чем на 2% по сравнению с компоновщиком GNU ld.
Ключевые слова: компоновщик, компиляция, C++, ELF, Google gold, GNU ld.
Время и вычислительные ресурсы, затрачиваемые на компиляцию больших программных продуктов, значительны. Поэтому помимо автоматизации и обеспечения кроссплатформенности основной задачей систем сборки и инструментов для разработки программного обеспечения является уменьшение времени компиляции [2, 4]. Это достигается преимущественно за счет трансляции только измененных файлов с исходным кодом при повторной компиляции. Кроме того, компиляция может выполняться параллельно на кластере машин [1]. В отличие от трансляции компоновка исполняемых файлов и библиотек осуществляется только последовательно и всегда включает обработку всех объектных файлов и библиотек, что может оказывать значительное влияние на общее время компиляции.
С целью уменьшить время компоновки в качестве замены GNU ld компания Google разработала компоновщик gold. В отличие от ld, работающего с разными форматами исполняемых файлов, в частности ELF, a.out и COFF, gold поддерживает только формат ELF, что скорее всего позволило разработчикам сосредоточиться на быстродействии, а не универсальности. Другой особенностью gold является многопоточность. Согласно заявлениям разработчиков Google, использование компоновщика gold позволяет уменьшить время компиляции отдельных программ на C++ от двух до пяти раз по сравнению c GNU ld [3], при этом не уточняется, в каких конкретно случаях достигается подобное преимущество.
В данной работе оценивается эффективность использования Google gold при полной компиляции больших программных продуктов, реализованных на C++, состоящих из значительного числа программ и библиотек. Для этого использован проект из примерно 2500 файлов с исходным кодом и 3500 заголовочных файлов общим размером ≈2.3 ГБ. Объем кода составляет порядка миллиона строк. Результатом компиляции являются около 200 библиотек и исполняемых файлов. Система сборки основана на GNU make, что позволяет выполнять компиляцию параллельно. Используются компилятор LLVM clang++ v. 3.4 и компоновщики gold v. 1.11 и ld v. 2.20 из пакетов GNU binutils версий 2.24 и 2.20 соответственно. Компиляция выполняется в 16 потоков на сервере с двумя восьмиядерными процессорами Intel Xeon E5-2690 с тактовой частотой 2.9 МГц. Функция Hyper- Threading процессора отключена. На сервере используются жесткие диски Hitachi с скоростью вращения 10000 об/мин и средним временем поиска 7.1 мс. Сервер работает под управлением операционной системы Oracle Linux 6.5 с ядром linux-3.8, для хранения данных используется файловая система ext4.
Значения среднего времени t компиляции всего проекта приведены в Табл.1. При компиляции для отладки (без оптимизации и с отладочными символами) преимущество при использование Google gold не превышает 2% по сравнению с GNU ld. При компиляции с оптимизацией разница составляет порядка 1%. Аналогичные результаты получены при компиляции проекта на файловой системе tmpfs, хранящей все файлы в оперативной памяти, что позволяет исключить влияние дискового ввода-вывода на общее время компиляции.
Таблица 1
Среднее время компиляции всего проекта.
t для отладки, c
|
t с оптимизацией, c
|
ld
|
gold
|
ld
|
gold
|
415
|
408
|
441
|
439
|
Для объяснения полученных результатов проанализирована зависимость времени, затрачиваемого только на компоновку, от размера результирующего исполняемого файла без учета других этапов компиляции (в частности, трансляции и оптимизации) и операций дискового ввода-вывода. Согласно результатам, приведенным в Табл.2, компоновщик gold работает почти в два раза быстрее ld вне зависимости от размера исполняемого файла. Очевидно, что данное преимущество сохранится при компиляции проекта, где изменено лишь несколько исходных файлов. Сопоставив данные результаты с результатами из Табл.1, можно сделать вывод, что время компоновки составляет лишь незначительную часть общего времени компиляции, поэтому при компиляции больших проектов не может сказываться на результатах.
Таблица 2
Среднее время компоновки исполняемых файлов.
Размер результирующего
исполняемого файла, МБ
|
Среднее время компоновки исполняемых файлов, с
|
Google gold
|
GNU ld
|
145
|
1.275
|
2.431
|
100
|
1.274
|
2.604
|
30
|
0.402
|
0.788
|
В данной работе установлено, что среднее время компоновки при использовании Google gold уменьшается минимум в два раза по сравнению c GNU ld вне зависимости от размера результирующего исполняемого файла. Однако при компиляции больших программных продуктов на С++ использование компоновщика gold позволяет уменьшить среднее время компиляции не более, чем на 2% вне зависимости от скорости операций ввода-вывода. Это объясняется тем, что на время компиляции больших продуктов в большей степени влияет время трансляции и оптимизации. Таким образом, Google gold позволяет получить наиболее существенное преимущество при компиляции проекта с уже оттранслированными исходными файлами.
Авторы выражают признательность своему коллеге Косякову М.С. за плодотворное сотрудничество по тематике работы и полезные замечания.
Список литературы
1. Hall J. Distributed computing with distcc // Linux Journal. – 2007. – November (163).
2. Smith P. Software build systems: principles and experience. – Addison-Wesley Professional. – 2011. – 624 p.
3. Taylor I.L. A New ELF Linker // In Proceedings of the GCC Developers Summit. – 2008. – P. 129-136.
4. Ошурок Э.Э., Ежова К.В. Кроссплатформенный инструментарий разработки программных продуктов // Научно-технический вестник информационных технологий, механики и оптики. – 2012. – № 4 (80). – С. 153–155.