- vừa được xem lúc

Những thay đổi trong ruby 3.0

0 0 47

Người đăng: Pham Van Linh

Theo Viblo Asia

2020 là một năm lớn đối với cộng đồng Ruby. Những người sáng lập Ruby có một món quà thực sự tuyệt vời cho chúng ta vào giáng sinh với việc phát hành Ruby 3.0!

Món quà tuy đẹp nhưng bên trong cũng có rất nhiều tính năng hay ho.

Bản nâng cấp lần này tập trung vào một số vấn đề chính là : performance, concurrency, static analysis, transition issues.

Performance

Mọi người đều biết Ruby là ngôn ngữ hoàn hảo cho MVPs, prototypes vàstartups, nhưng tốc độ của Ruby chắc chắn là vấn đề lớn nhất đối với ngôn ngữ lập trình.

Ruby 3.0 nhanh gấp 3 lần so với Ruby 2.

Theo như Optcarrot benchmark đo hiệu suất luồng, dựa trên khối lượng công việc mô phỏng trò chơi của NES. Kết quả khá bất ngờ :

Trong version 2.6 vẫn còn một số vẫn đề về hiệu suất của Ruby on Rails về việc sứ dụng bộ nhớ. Vấn đề này xảy ra khi các lập trình viên tạo đối tượng mới sau đó bị swept away. Khi điều này xảy ra rất nhiều không gian cho các đối tượng như vậy vẫn chưa được sử dụng và chúng ta sử dụng nhiều bộ nhớ hơn mức thực sự cần thiết.

Để khác phục điều này version 3.0 đã được giải quyết bằng một trình nén rác (GP).

GP làm 2 nhiệm vụ chính :

  1. Tách đối tượng: trong khi một số đối tượng được ghim, phần còn lại có thể được chuyển vào heap.
  2. Tự động nén: không có lệnh đặc biệt nào được yêu cầu để thu gọn rác - trong phiên bản mới, tính năng nén tự động được hỗ trợ đầy đủ.

Hiệu suất CPU

Một trong những bản cập nhật để hứa hẹn nhất cho hiệu suất của CPU Ruby . Ruby đã tối ưu hóa trình biên dịch JIT (Just In Time) từ các phiên bản trước. Trình biên dịch Ruby MJIT lần đầu tiên được giới thiệu trong Ruby 2.6. Ruby 3 MJIT đi kèm với bảo mật tốt hơn và dường như cải thiện hiệu suất của ứng dụng web ở mức độ cao hơn.

Việc triển khai MJIT khác với JIT thông thường. Khi các phương thức được gọi nhiều lần, v.d. 10000 lần, MJIT sẽ chọn các phương thức như vậy có thể được biên dịch thành mã gốc và đặt chúng vào một hàng đợi. Sau đó MJIT sẽ tìm nạp hàng đợi và chuyển đổi chúng thành mã gốc.

Concurrency / Parallel

Ractor

Concurrency rất quan trọng trong đa luồng . Nhờ Ractor (một mô hình Actor giống như trừu tượng concurrency), cùng với Async Fiber, Ruby trở thành một ngôn ngữ concurrency thực sự. Ractor cho phép thực thi song song mà không lo ngại về an toàn vì nó có thể chia sẻ các đối tượng bình thường. Giao tiếp giữa các Ractors được hỗ trợ bằng cách trao đổi tin nhắn.

Để hạn chế việc chia sẻ các đối tượng, Ractor đưa ra một số hạn chế đối với cú pháp của Ruby (không có nhiều Ractor thì không có hạn chế nào).

Chương trình nhỏ sau đây đo thời gian thực hiện của chức năng tak chuẩn nổi tiếng ( Tak (function) - Wikipedia ), bằng cách thực hiện nó 4 lần tuần tự so với 4 lần song song với ractors.

def tarai(x, y, z) = x <= y ? y : tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y))
require 'benchmark'
Benchmark.bm do |x| # sequential version x.report('seq'){ 4.times{ tarai(14, 7, 0) } } # parallel version x.report('par'){ 4.times.map do Ractor.new { tarai(14, 7, 0) } end.each(&:take) }
end

Kết quả khá tốt khi chạy song song nhanh hơn gấp 3,87 so với việc chạy tuần tự với cấu hình Ubuntu 20.04, Intel(R) Core(TM) i7-6700 (4 cores, 8 hardware threads).

Benchmark result: user system total real
seq 64.560736 0.001101 64.561837 ( 64.562194)
par 66.422010 0.015999 66.438009 ( 16.685797)

Fiber Scheduler

Được giới thiệu để đánh chặn các hoạt động chặn, cho phép đồng thời trọng lượng nhẹ mà không cần thay đổi mã hiện có.

Các lớp/ phương thức hỗ trợ :

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • Process.wait
  • IO#wait, IO#read, IO#write, and related methods (e.g. #wait_readable, #gets, #puts, and so on).

Các tính năng mới đáng chú ý khác

One-line pattern matching syntax change Đối sánh mẫu một dòng trước đây đã sử dụng in bây giờ nó được thay thế bằng =>

example:

ruby 2.7: { name: 'John', role: 'CTO' } in {name:}

ruby 3.0 { name: 'John', role: 'CTO' } => {name:}

**Endless Method **

Ruby 3.0 bổ sung thêm định nghĩa phương thức vô tận. Nó cho phép chúng ta tạo các định nghĩa phương pháp mà không cần từ khóa end

def square(x) = x * x

Kết luận

Với những cải tiến lớn về hiệu suất, khả năng sử dụng bộ nhớ, phân tích tĩnh và các tính năng mới, nhà phát triển đã rất tin tưởng vào tương lai của Ruby. Với Ruby 3, các ứng dụng có thể mở rộng hơn và làm việc thú vị hơn. Năm 2021 sắp tới không chỉ là một năm mới mà còn là một kỷ nguyên mới cho tất cả những người theo chủ nghĩa Ruby.

Tài liệu tham khảo :

https://medium.com/selleo/why-is-ruby-still-a-good-choice-in-2021-an-introduction-to-ruby-3-0-cc8a3d588bbc

https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/

Bình luận

Bài viết tương tự

- vừa được xem lúc

Bài toán tìm đường đi ngắn nhất với giải thuật Dijkstra

Với các bạn sinh viên chuyên ngành công nghệ thông tin, chắc không lạ gì với bài toán tìm đường đi ngắn nhất (Shortest Path Problems) trong đồ thị trọng số nữa. Ở bài viết lần này, mình sẽ làm 3 việc:.

0 0 135

- vừa được xem lúc

Tôi cá là bạn không biết những điều này - Ruby on rails ( Phần 2)

Các bạn có thể theo dõi phần 1 ở đây :. https://viblo.asia/p/toi-ca-la-ban-khong-biet-nhung-dieu-nay-ruby-on-rails-phan-1-WAyK8DDeKxX. 5.

0 0 222

- vừa được xem lúc

Có gì đặc biệt trong phiên bản Ruby 3x3 ?

Hello guys, chắc hẳn thời gian vừa rồi chúng ta cũng đã nghe qua thông tin Ruby sắp cho ra mắt Ruby version 3, hay còn được gọi là ruby 3x3, vậy liệu Ruby version 3 này có gì mới, và có những update nào đáng phải kể đến, và tại sao mọi người lại gọi nó là ruby version 3x3, thì trong bài ngày hôm nay

0 0 43

- vừa được xem lúc

Cách sử dụng class Time & Date trong Ruby (Phần 1)

Time là một class trong Ruby, nó sẽ giúp chỉnh sửa format, trích xuất thông tin một cách hiệu quả theo ý của bạn. . Topic hôm nay chúng ta có gì nào. .

0 0 97

- vừa được xem lúc

Ruby 3.0 có gì mới

Ruby 3.0.0 đã được ra mới được ra mắt vào tháng 12/2020, mục tiêu của bản 3.0.

0 0 41

- vừa được xem lúc

Gửi mail với Ruby

Giả sử bạn có một ứng dụng Ruby đang hoạt động và cần thêm chức năng gửi email vào ứng dụng đó. Điều này có thể liên quan đến xác thực người dùng hoặc bất kỳ loại email giao dịch nào khác, nó không có gì khác biệt.

0 0 43