Я обновил сервер до FreeBSD-10 / gcc48, и мой проект, который использует ar для помещения подпроектов в статические библиотеки, теперь связывает возмутительно медленно.
10.0-RELEASE-p4 FreeBSD 10.0-RELEASE-p4 #0: Tue Jun 3 13:14:57 UTC 2014 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64
Игра с разными флагами ар:
«Time ar -v -c -u -q …»: 362,62 реальный 0,11 пользователь 0,82 sys
«Time ar v -c -r -u -s …»: 407,94 реальный 0,13 пользователь 0,80 сис
Это должно быть в десять раз медленнее, чем раньше (FreeBSD-8, стандартный компилятор GCC). Что я могу сделать, чтобы улучшить это? GNU Libtool просто использует ar за кулисами (так что не поможет), верно? Стоит ли вообще обходить статические библиотеки? (Но разве сборка .so не займет столько же времени?) Излишне говорить, что это убивает время моего цикла разработки.
Эта проблема вызвана тем, что шаблон доступа ввода-вывода ar (1) взаимодействует с кодом предотвращения тупиков UFS ядра и исправлен во FreeBSD. r284298. Это будет доступно в сборках моментальных снимков FreeBSD-CURRENT в середине июля 2015 года и должно быть перенесено для FreeBSD 10.2.
Невозможно решить ar
и не видя этого ни с чем другим, я создал RAM-диск, достаточно большой, чтобы вместить мой самый большой ar
выходной файл, а затем взломал мою сборку для вывода ar
тогда mv
файл в исходное место назначения.
Это устраняет проблему с производительностью и представляет собой довольно автономный обходной путь, но вы можете себе представить предостережения. (Создание RAM-диска требует root-доступа, содержит ресурс, который вам нужен только временно, плохо масштабируется для множества задач и т. Д.).