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

Trình biên dịch JIT cho Ruby &Rails:Tăng hiệu suất với YJIT, MJIT và TenderJIT

Một chương trình được biên dịch trong thời gian chạy bằng một phương pháp khác với phương pháp biên dịch trước khi thực hiện. Quá trình này được gọi là biên dịch đúng lúc hoặc dịch động.

Trong bài đăng này, chúng ta sẽ xem xét lý do tại sao quá trình biên dịch JIT có thể là một lựa chọn tốt cho ứng dụng Ruby on Rails của bạn, trước khi xem xét một số tùy chọn có sẵn (YJIT, MJIT và TenderJIT) cũng như cách cài đặt chúng.

Nhưng trước tiên:quá trình biên dịch JIT hoạt động như thế nào?

Trình biên dịch JIT hoạt động như thế nào

Biên dịch đúng lúc là một phương pháp chạy mã máy tính yêu cầu biên dịch trong khi chạy chương trình.

Điều này có thể đòi hỏi phải dịch mã nguồn, nhưng nó thường được thực hiện nhất bằng cách chuyển đổi mã byte thành mã máy, sau đó mã này được chạy trực tiếp.

Mã đang được thực thi thường được hệ thống phân tích liên tục bằng trình biên dịch JIT. Điều này xác định các phần mã mà lợi ích của việc biên dịch hoặc biên dịch lại (về tốc độ) lớn hơn chi phí.

Lợi ích của việc biên dịch JIT cho Ruby

Quá trình biên dịch JIT kết hợp một số lợi ích (và nhược điểm) của hai phương pháp thông thường để chuyển đổi chương trình thành mã máy:diễn giải và biên dịch trước thời hạn (AOT).

Nói một cách đại khái, nó kết hợp tính linh hoạt của việc diễn giải với tốc độ tạo mã cũng như chi phí bổ sung cho việc biên dịch và liên kết (không chỉ phiên dịch).

Biên dịch JIT là một loại biên dịch động cho phép các kỹ thuật tối ưu hóa thích ứng, bao gồm biên dịch lại động và tăng tốc phù hợp với các kiến trúc vi mô nhất định. Do khả năng của hệ thống thời gian chạy trong việc xử lý các loại dữ liệu bị giới hạn muộn và áp đặt các đảm bảo bảo mật, các ngôn ngữ lập trình động như Ruby đặc biệt phù hợp để diễn giải và biên dịch JIT.

Một trình biên dịch tối ưu hóa như GCC có thể tối ưu hóa các hướng dẫn hiệu quả hơn — một lợi thế đáng kể của việc áp dụng kiến trúc hướng đăng ký. Trình biên dịch hoạt động trên cơ sở biểu diễn trung gian với kiến trúc dựa trên thanh ghi.

Khi các hướng dẫn của bạn đạt đến mức biểu diễn trung gian trong quá trình biên dịch, GCC sẽ thực hiện các bước bổ sung để tăng tốc độ thực thi các hướng dẫn của CPU.

Trình biên dịch JIT cho Ruby:YJIT, MJIT và TenderJIT

Bây giờ, hãy khám phá các trình biên dịch JIT khác nhau có sẵn cho Ruby — YJIT, MJIT và TenderJIT — và cách bạn có thể thiết lập chúng.

MJIT (Trình biên dịch đúng lúc dựa trên phương thức) cho Ruby

Vladimir Makarov đã triển khai MJIT và đây là phương pháp biên dịch đầu tiên được triển khai trong Ruby dựa trên ngôn ngữ C. Nó hoạt động với Ruby 2.6, sử dụng các lệnh YARV và biên dịch các lệnh thường được sử dụng trong mã nhị phân.

Đối với các chương trình không bị giới hạn đầu vào/đầu ra, MJIT nâng cao hiệu suất.

YJIT tốt hơn trình biên dịch dựa trên C gốc này về mặt hiệu suất. JIT của Ruby 3 là JIT nhanh nhất mà MRI từng có, nhờ thành quả xuất sắc của MJIT.

Cách sử dụng MJIT

Để sử dụng MJIT, bạn có thể kích hoạt JIT trong Ruby 2.6 và bằng --jit tùy chọn.

 

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

 

Một tập hợp các cài đặt dành riêng cho JIT có trong Ruby 2.6 giúp chúng tôi hiểu cách thức hoạt động của nó. Chạy ruby --help để xem các tùy chọn này.

Nói tóm lại, MJIT thực thi trong một luồng khác và không đồng bộ. Nó sẽ bắt đầu biên dịch đúng lúc sau năm lần tính toán đầu tiên.

YJIT cho Ruby on Rails

Một trình biên dịch JIT gần đây có tên YJIT đã được phát hành cùng với Ruby 3.1. Nó hứa hẹn nhiều cải tiến và hiệu suất tốt hơn. Vẫn là một dự án đang trong quá trình thực hiện do Shopify thiết kế với kết quả thử nghiệm, nó phải được sử dụng một cách thận trọng, đặc biệt là trên các ứng dụng lớn hơn.

Với ý nghĩ đó, YJIT nâng cao hiệu suất của các ứng dụng Ruby on Rails. Phần lớn phần mềm trong thế giới thực được hưởng lợi từ khả năng khởi động nhanh và cải tiến hiệu suất do trình biên dịch JIT phiên bản khối cơ bản YJIT cung cấp.

Trình biên dịch JIT sẽ dần dần được tích hợp vào CRuby như một phần của dự án YJIT, cuối cùng sẽ thay thế trình thông dịch trong hầu hết quá trình thực thi mã.

Điểm chuẩn chính thức — xem 'YJIT:Xây dựng Trình biên dịch JIT mới cho CRuby' — cho thấy YJIT đã cải thiện hiệu suất so với trình thông dịch CRuby mặc định bằng cách:

  • 20% trên Railsbench
  • 39% khi hiển thị mẫu lỏng
  • 37% trên bản ghi hoạt động

Tuy nhiên:

Chỉ có khoảng 79% lệnh trong Railsbench được thực thi bởi YJIT và phần còn lại chạy trong trình thông dịch mặc định.

Nguồn:YJIT:Xây dựng trình biên dịch JIT mới cho CRuby

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

Mặc dù vậy, YJIT ít nhất cũng hoạt động tốt như trình thông dịch trên mọi điểm chuẩn, ngay cả trên những điểm chuẩn khó nhất và đạt hiệu suất gần như cao nhất chỉ sau một lần lặp lại mỗi điểm chuẩn.

Cách sử dụng YJIT

Lưu ý :YJIT hiện bị giới hạn ở macOS và Linux trên nền tảng x86-64. Ngoài ra, như đã đề cập, YJIT không được khuyến khích cho các ứng dụng lớn.

YJIT bị tắt theo mặc định. Nếu bạn muốn kích hoạt nó, trước tiên hãy chỉ định --yjit tùy chọn dòng lệnh.

Bạn cần kiểm tra xem nó đã được cài đặt chưa, vì vậy hãy chạy ruby --enable-yjit -v . Nếu warning: unknown argument for --enable: yjit'` hiện lên, bạn phải cài đặt nó.

Sau đó mở irb và đặt RUBY_YJIT_ENABLE=1 . Bạn có thể thoát và bây giờ bạn đã sẵn sàng sử dụng YJIT. Lệnh ruby --enable-yjit -v phải trả lại một cái gì đó như ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin21]

Đấu thầuJIT

Với thiết kế chủ yếu dựa trên YJIT, TenderJIT là trình biên dịch JIT thử nghiệm cho Ruby. Điều khác biệt ở TenderJIT là nó được viết bằng Ruby thuần túy.

Đây là một dự án demo và mục đích là biến nó thành một viên ngọc quý. Trong thời gian chờ đợi, bạn có thể thử nghiệm nó nhưng hãy nhớ rằng nó vẫn đang trong quá trình hoàn thiện. Cần có Ruby 3.0.2 trở lên cho TenderJIT.

Cách sử dụng TenderJIT

TenderJIT hiện không tự động biên dịch phương thức. Để biên dịch một phương thức, bạn phải định cấu hình TenderJIT theo cách thủ công.

Sao chép kho lưu trữ và chạy các lệnh sau:

 

Bạn phải đặt thủ công trên mã của mình:

 

Mỗi lệnh YARV trong phương thức đích được TenderJIT đọc, sau đó chuyển nó thành mã máy.

Để biết thêm ví dụ về TenderJIT, hãy xem một trong các video sau:Trình biên dịch JIT cho Ruby với Aaron Patterson và Hacking trên TenderJIT!

Kết thúc

Trong bài đăng này, chúng tôi đã xem nhanh ba trình biên dịch JIT cho Ruby - MJIT, YJIT và TenderJIT - và cách thiết lập chúng. Mỗi tùy chọn đều mang tính thử nghiệm và có những hạn chế riêng.

Tuy nhiên, YJIT là công ty trưởng thành nhất vào thời điểm hiện tại và có tiềm năng phát triển và mở rộng quy mô lớn nhất. Nó thể hiện hiệu suất tốt hơn so với các JIT Ruby khác, được phát triển với Ruby 3.1.0 và nhanh chóng trở thành một phần quan trọng của CRuby.

Hãy xem bài đăng này nếu bạn muốn xây dựng trình biên dịch của riêng mình cho Ruby.

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

Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!

Trình biên dịch JIT cho Ruby &Rails:Tăng hiệu suất với YJIT, MJIT và TenderJIT

Renata Marques

Tác giả khách mời Renata của chúng tôi là kỹ sư phần mềm và nhà khoa học máy tính tập trung vào Ruby và Javascript. Cô thích giúp đỡ cộng đồng nhà phát triển bằng cách đóng góp cho các dự án nguồn mở. Khi rảnh rỗi, cô ấy thích xem và thảo luận về phim và chương trình truyền hình, đọc sách, nghe nhạc, chụp ảnh và làm video.

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