Установка 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 меньше по умолчанию) подсказали интересную статью о возможностях создания исполняемого файла Rust с минимальными размерами... но и, естественно, с максимально ограниченными возможностями.
Так же полезные рекомендации по уменьшению размера исполняемого файла нашёл на GitHub min-sized-rust, следуя им, прописал в файле Cargo.toml
[profile.release] strip = true lto = true opt-level = "z" # Optimize for size.
получил размер исполняемого файла 297 Килобайт.