и libjit и llvm в принципе не предназначены, чтобы писать код на них ручками. Предполагается что должно быть какое-то дерево разбора, по которому генерируется код. поэтому разумеется когда пишешь это используя только API, код будет скриптообразный и тяжелый для восприятия.
Насчет подгрузки файла, да разумеется, так можно было сделать, но я считаю это шагом назад от обьективного сравнения. Тогда получится, что для libjit время трансляции в исполняемый код полностью включено в результирующее время, а для llvm — только частично.
Простой тест libjit vs llvm