Рассмотрено влияние компоновщиков на общее время компиляции программ. Показано, что 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.