Производительность Ubuntu-пакета Jq удалось увеличить в 1.9 раза путём пересборки

Опубликованы результаты оценки влияния на производительность пересборки пакетов для Ubuntu с различными опциями и реализациями функций выделения памяти. Экспериментатору удалось на 90% (в 1.9 раза) повысить производительность пакета jq с инструментарием для обработки данных в формате JSON, путём обычной пересборки из того же пакета с исходным кодом, без внесения изменений в сам код. Производительность оценивалась через измерение времени выполнения типового фильтрующего запроса над данными GeoJSON, размером 500МБ.

Итоги эксперимента:

  • Вариант, собранный в GCC из тех же исходных текстов с флагами по умолчанию оказался быстрее бинарного пакета Ubuntu на 2-4%.
  • Пересборка в Clang 18 с уровнем оптимизации”-O3″, включением оптимизации на этапе связывания (“-flto”) и отключением отладочной информации (“-DNDEBUG”) привела к ускорению на 20%.
  • Пересборка с системой распределения памяти TCMalloc (добавление “-L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal” в LDFLAGS) привела к ускорению на 40%.
  • Замена функций malloc на системы распределения памяти tcmalloc, jemalloc и mimalloc через “LD_PRELOAD=/usr/lib/x86_64-linux-gnu/lib….so” привела к увеличению производительности на 27%, 29% и 44%. При запуске с mimalloc, показавшем ускорение на 44%, выставлялась переменная окружения “MIMALLOC_LARGE_OS_PAGES=1”.
  • Пересборка пакета с mimalloc в LDFLAGS вместо связывания через LD_PRELOAD привела к ускорению прохождения теста на 90%. Другой тест по обработке 2.2GB JSON-данных в 13000 файлах также показал прирост производительности примерно в два раза.
Release. Ссылка here.