Установка Ruby 3.4.5 с поддержкой YJIT
Перед установкой Ruby 3.4.5 с поддержкой YJIT необходимо дополнительно установить язык программирования Rust. На сайте языка программирования Rust описан процесс установки - всё очень просто, и при этом устанавливается локально (для отдельного пользователя) так же как и Ruby с использованием rbenv
.
Далее устанавливаем Ruby с использованием rbenv
:
RUBY_CONFIGURE_OPTS="--enable-yjit --with-jemalloc" rbenv install 3.4.5
Готово! Проверил на простейшем тесте, с опцией --yjit
Ruby показал увеличение производительности примерно в 7 (!) раз.
require "benchmark" def fib(n) return n if n <= 1 fib(n - 1) + fib(n - 2) end Benchmark.bm do | make | i = 0 5.times do make.report { puts fib(30 + i) } i += 1 end end # ruby 832040 1346269 2178309 3524578 5702887 user system total real 0.049743 0.000000 0.049743 ( 0.049761) 0.079215 0.000000 0.079215 ( 0.079220) 0.140853 0.000000 0.140853 ( 0.140877) 0.212678 0.000000 0.212678 ( 0.212693) 0.339520 0.000000 0.339520 ( 0.339545) # ruby --yjit 832040 1346269 2178309 3524578 5702887 user system total real 0.007006 0.000000 0.007006 ( 0.007047) 0.010964 0.000000 0.010964 ( 0.010965) 0.017635 0.000040 0.017675 ( 0.017693) 0.028405 0.000039 0.028444 ( 0.028446) 0.045776 0.000000 0.045776 ( 0.045778)
Естественно, что этот тест искусственный, и не стоит ожидать, что все программы на Ruby станут работать быстрее, но всё же результаты оптимизации скорости выполнения программ Ruby налицо и очень впечатляют.
Немного о Rust
Несколько разочаровал тот факт, что исполняемые файлы Rust (версия 1.88.0) получаются достаточно большого объёма - простая программа "Hello, World!" - это исполняемый файл в системе Linux объёмом аж 3.6 Мегабайт - это очень много!.. с учётом того, что Rust позиционируется как язык системного программирования, где, как известно, малый объём исполняемых файлов - это большое преимущество. Но не так всё страшно - можно воспользоваться либо командой:
strip --strip-debug <binary>
либо в проекте cargo
прописать в файле Cargo.toml
:
[profile.release] strip = "debuginfo"
Тогда исполняемый файл релиза получается размером 416 Килобайт, что в принципе приемлемо, хотя тоже многовато.
На Хабр подсказали интересную статью о возможностях создания исполняемого файла Rust с минимальными размерами... но и, естественно, с максимально ограниченными возможностями.