Юля каждый раз компилирует скрипт?
Язык Джулии компилирует скрипт каждый раз, не можем ли мы вместо этого скомпилировать двоичные файлы с Джулией? Я попробовал небольшой сценарий helloworld с функцией println. Джулии понадобилось 2,3 секунды, чтобы показать результат! Было бы лучше, если бы мы могли делать бинарные файлы вместо компиляции каждый раз
Обновление: в Юлии произошли некоторые изменения, так как я задал этот вопрос. Хотя я больше не слежу за обновлениями для julia, так как я задал этот вопрос, и если вы ищете что-то похожее, посмотрите ответы и комментарии ниже людей, которые следят за julia.
Также полезно знать, что теперь для загрузки скрипта требуется около 150 мс.
2 ответа
В настоящий момент Julia JIT при запуске компилирует всю стандартную библиотеку. Мы знаем об этой ситуации и в настоящее время работаем над кэшированием выходных данных JL LLVM, чтобы исправить ситуацию, но до тех пор нет никакого способа обойти ее (кроме использования REPL).
Ответ Кено точен, но, может быть, я могу немного подробнее рассказать о том, что происходит и что мы собираемся с этим делать.
В настоящее время существует только режим LLVM JIT:
- Существует очень тривиальный интерпретатор для некоторых простых утверждений верхнего уровня.
- Весь другой код вставляется в машинный код перед выполнением. Код агрессивно специализирован с использованием типов времени выполнения значений, к которым применяется код, распространяемых через программу с использованием динамического вывода типов.
Вот как Юлия получает хорошую производительность, даже когда код написан без аннотаций типов: если вы звоните f(1)
Вы получаете специализированный код для Int64
- тип 1
на 64-битных системах; если ты позвонишь f(1.0)
Вы получаете новую версию, которая специализируется на Float64
- тип 1.0
на всех системах. Поскольку каждая скомпилированная версия функции знает, какие типы она будет получать, она может работать с C-подобной скоростью. Вы можете саботировать это, написав и используя "нестабильные" функции, тип возвращаемого значения которых зависит от данных времени выполнения, а не только от типов, но мы очень старались не делать этого при разработке основного языка и стандартной библиотеки.
Большая часть Джулии написана сама по себе, затем проанализирована, выведена и выведена, поэтому начальная загрузка всей системы с нуля занимает около 15-20 секунд. Чтобы сделать это быстрее, у нас есть поэтапная система, в которой мы анализируем, выводим тип, а затем кэшируем в файл сериализованную версию AST с выводом типа в файле sys.ji
, Этот файл затем загружается и используется для запуска системы при запуске julia
, Код LLVM или машинный код не кэшируются в sys.ji
тем не менее, поэтому все джитирование LLVM все еще нужно делать каждый раз julia
запускается, что, следовательно, занимает около 2 секунд.
Эта 2-секундная задержка запуска довольно раздражающая, и у нас есть план по ее устранению. Основной план состоит в том, чтобы иметь возможность компилировать целые программы Julia в двоичные файлы: либо исполняемые файлы, которые можно запустить, либо .so
/.dylib
общие библиотеки, которые можно вызывать из других программ, как если бы они были просто общими библиотеками Си. Время запуска двоичного файла будет таким же, как и для любой другой программы на С, поэтому задержка запуска в 2 секунды исчезнет.
Приложение 1: С ноября 2013 года у версии Julia для разработки больше нет двухсекундной задержки запуска, поскольку она предварительно компилирует стандартную библиотеку в виде двоичного кода. Время запуска по-прежнему в 10 раз медленнее, чем у Python и Ruby, поэтому есть возможности для улучшений, но это довольно быстро. Следующим шагом будет разрешить предварительную компиляцию пакетов и сценариев, чтобы они могли запускаться так же быстро, как это делает сама Юлия.
Приложение 2: С июня 2015 года разработанная версия Julia автоматически прекомпилирует множество пакетов, что позволяет быстро их загружать. Следующий шаг - статическая компиляция целых программ Julia.