Новости
12.04.2024
Поздравляем с Днём космонавтики!
08.03.2024
Поздравляем с Международным Женским Днем!
23.02.2024
Поздравляем с Днем Защитника Отечества!
Оплата онлайн
При оплате онлайн будет
удержана комиссия 3,5-5,5%








Способ оплаты:

С банковской карты (3,5%)
Сбербанк онлайн (3,5%)
Со счета в Яндекс.Деньгах (5,5%)
Наличными через терминал (3,5%)

АНАЛИЗ ПЕРСПЕКТИВ ВНЕДРЕНИЯ КОМПОНОВЩИКА GOOGLE GOLD В ПРОГРАММНЫЕ ПРОДУКТЫ НА C++

Авторы:
Город:
Санкт-Петербург
ВУЗ:
Дата:
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.