Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

JIT Compilers Cho Ruby & Rails: Tăng Hiệu Suất Với YJIT, MJIT, Và TenderJIT

Chương trình được compile tại runtime dùng phương thức khác pre-execution compilation. Quy trình này gọi là just-in-time compilation (biên dịch đúng lúc) hoặc dynamic translation (dịch động).

Trong bài này, chúng ta xem tại sao JIT compilation là lựa chọn tốt cho app Ruby on Rails, trước khi xem các option (YJIT, MJIT, TenderJIT) và cách cài.

Nhưng trước: JIT compiler hoạt động như thế nào?

Cách JIT Compiler Hoạt Động

Just-in-time compilation là phương thức chạy code máy tính yêu cầu compilation khi chạy chương trình.

Điều này có thể bao gồm translate source code, nhưng thường xuyên hơn chuyển bytecode thành machine code, sau đó chạy trực tiếp.

Code đang thực thi thường được phân tích liên tục bởi hệ thống dùng JIT compiler. Điều này xác định các section code nơi benefit của compilation hoặc recompilation (về speed) vượt quá cost.

Lợi Ích Của JIT Compilation Cho Ruby

JIT compilation kết hợp một số lợi ích (và shortcoming) của hai phương pháp thông thường chuyển chương trình thành machine code: interpretation (diễn dịch) và ahead-of-time compilation (AOT - biên dịch trước).

Nôm na, nó kết hợp sự linh hoạt của interpretation với tốc độ generated code, và overhead thêm của compiling và linking (không chỉ interpreting).

JIT compilation là dynamic compilation cho phép adaptive optimization, bao gồm dynamic recompilation và speed-ups tùy chỉnh microarchitectures. Do khả năng runtime system xử lý late-bound data types và enforce security guarantees, dynamic programming languages như Ruby đặc biệt phù hợp interpretation và JIT compilation.

Optimizing compiler như GCC có thể optimize instruction hiệu quả hơn — lợi thế lớn adopt register-oriented architecture. Compiler operate trên intermediate representation với register-based architecture.

Khi instruction đạt intermediate representation trong compilation, GCC làm additional passes để tăng tốc CPU execute instruction.

JIT Compilers Cho Ruby: YJIT, MJIT, Và TenderJIT

Bây giờ khám phá các JIT compiler khác nhau cho Ruby — YJIT, MJIT, TenderJIT — và cách setup.

MJIT (Method-based Just-in-time Compiler) Cho Ruby

Vladimir Makarov triển khai MJIT, compiler methodology đầu tiên trong Ruby dựa trên C. Nó work với Ruby 2.6, dùng YARV instructions, compile thường dùng instructions thành binary code.

Đối với chương trình không input/output-bound, MJIT tăng performance.

YJIT tốt hơn compiler C-based gốc về performance. Ruby 3's JIT là nhanh nhất MRI từng có, nhờ công việc xuất sắc của MJIT.

Cách Dùng MJIT

Để dùng MJIT, enable JIT trong Ruby 2.6 với option --jit.


Nếu bỏ qua phần này, MJIT sẽ báo lỗi.


Bộ cài đặt JIT-specific trong Ruby 2.6 giúp hiểu cách nó hoạt động. Chạy ruby --help xem options.

Tóm lại, MJIT execute trong thread khác và asynchronous. Nó bắt đầu JIT compilation sau 5 lần chạy calculation đầu tiên.

YJIT Cho Ruby on Rails

JIT compiler gần đây YJIT ra mắt với Ruby 3.1. Hứa hẹn nhiều cải tiến và performance tốt hơn. Vẫn work-in-progress do Shopify thiết kế với kết quả experimental, phải dùng cẩn thận, đặc biệt app lớn.

Có điều đó, YJIT tăng performance Rails app. Phần lớn real-world software hưởng fast warm-up và performance enhancement từ YJIT basic block versioning JIT compiler.

JIT compiler sẽ dần built vào CRuby như phần YJIT project, cuối cùng replace interpreter cho hầu hết code execution.

Official benchmarks — xem 'YJIT: Building a New JIT Compiler for CRuby' — chỉ YJIT cải thiện performance so với default CRuby interpreter bằng:

  • 20% trên railsbench
  • 39% trên liquid template rendering
  • 37% trên activerecord

Tuy nhiên:

Chỉ khoảng 79% instructions trong railsbench chạy bởi YJIT, phần còn lại chạy default interpreter.

Nguồn: YJIT: Building a New JIT Compiler for CRuby

Điều này nghĩa là còn nhiều việc để cải thiện kết quả YJIT hiện tại.

Dù vậy, YJIT perform ít nhất ngang interpreter trên mọi benchmark, kể cả hardest, và đạt near-peak performance sau chỉ một iteration mỗi benchmark.

Cách Dùng YJIT

Lưu ý: YJIT hiện giới hạn macOS và Linux trên platform x86-64. Cũng như nói, YJIT không khuyến khích cho large app (chưa).

YJIT disabled by default. Muốn enable, chỉ định option command-line --yjit.

Cần check đã cài chưa, chạy ruby --enable-yjit -v. Nếu warning: unknown argument for --enable: yjit'` hiện ra, phải cài.

Sau đó mở irb set RUBY_YJIT_ENABLE=1. Exit và bây giờ sẵn sàng dùng YJIT. Lệnh ruby --enable-yjit -v phải trả về kiểu ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin21]

TenderJIT

Với design largely based off YJIT, TenderJIT là experimental JIT compiler cho Ruby. Khác biệt: nó viết bằng pure Ruby.

Đây là demo project mục tiêu ship as gem. Trong lúc đó, bạn có thể experiment, nhưng nhớ vẫn work in progress. Ruby 3.0.2 trở lên required cho TenderJIT.

Cách Dùng TenderJIT

TenderJIT hiện không tự compile method. Để compile method, phải manually configure TenderJIT.

Clone repo và chạy lệnh:


Phải set manual trên code:


Mỗi YARV instruction trong target method được TenderJIT đọc, transform thành machine code.

Tham khảo video: A JIT compiler for Ruby with Aaron Patterson và Hacking on TenderJIT!

Kết Luận

Trong bài, chúng ta nhìn nhanh ba JIT compiler Ruby — MJIT, YJIT, TenderJIT — và cách setup. Mỗi option experimental và có limitation riêng.

Tuy nhiên, YJIT mature nhất lúc này, và tiềm năng grow và scale lớn nhất. Nó demo performance tốt hơn Ruby JIT khác, develop với Ruby 3.1.0, và nhanh trở thành phần quan trọng CRuby.

Xem bài này nếu muốn build compiler riêng cho Ruby.

Chúc bạn viết mã vui vẻ!

P.S. Nếu bạn muốn đọc các bài Ruby Magic ngay khi chúng xuất bản, hãy đăng ký bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ bất kỳ bài viết nào!

JIT Compilers Cho Ruby & Rails: Tăng Hiệu Suất Với YJIT, MJIT, Và TenderJIT

Renata Marques

Tác giả khách Renata là software engineer và computer scientist tập trung Ruby và Javascript. Cô thích giúp dev community bằng contribute open source. Thời gian rảnh, thích xem/phân tích phim, show TV, đọc sách, nghe nhạc, nhiếp ảnh, làm video.

Tất cả bài viết của Renata Marques