Phiên bản Ruby mới liên tục cải tiến & Ruby 2.5 không ngoại lệ.
Ruby 2.5 giới thiệu các tối ưu hóa:
- Nội suy chuỗi (String interpolation) nhanh ~72% khi tạo chuỗi lớn
- String#prepend nhanh ~42% nếu chỉ một tham số
- Enumerable#sort_by, Enumerable#min_by & Enumerable#max_by nhanh ~50%
Hãy xem benchmark!
Hiệu suất Nội suy chuỗi
Tôi lấy mã ví dụ trong commit message cho tối ưu này:
require 'benchmark/ips'
Benchmark.ips do |x|
x.report "Large string interpolation" do |t|
a = "Hellooooooooooooooooooooooooooooooooooooooooooooooooooo"
b = "Wooooooooooooooooooooooooooooooooooooooooooooooooooorld"
t.times { "#{a}, #{b}!" }
end
x.report "Small string interpolation" do |t|
a = "Hello"
b = "World"
t.times { "#{a}, #{b}!" }
end
x.compare!
end
Tôi chạy benchmark với kết quả sau.
Ruby 2.4.1:
Small string interpolation: 3236291.1 i/s Large string interpolation: 1711633.4 i/s - 1.89x slower
Ruby 2.5:
Small string interpolation: 3125175.1 i/s Large string interpolation: 2555782.6 i/s - 1.22x slower
Như bạn thấy sự khác biệt cho chuỗi lớn khá đáng kể!
Hiệu suất String#prepend
Phương thức prepend cho phép chèn văn bản trước mảng (sửa: chuỗi).
Ruby 2.5 tối ưu cho trường hợp phổ biến nhất, prepend chỉ một chuỗi vào chuỗi khác.
Đây là kết quả benchmark.
Kết quả Ruby 2.4.1:
String#prepend 3.428M (± 3.2%) i/s - 17.159M in 5.011008s
Kết quả Ruby 2.5:
String#prepend 4.638M (± 3.6%) i/s - 23.276M in 5.025562s
Đó là cải tiến khá tốt!
Cải tiến hiệu suất Enumerable
Một vài phương thức Enumerable nhận được nâng cấp hiệu suất.
Tối ưu này hoạt động vì nó bỏ qua dispatch phương thức cho <=>.
Như mô tả trong commit message:
“Sử dụng OPTIMIZED_CMP() để so sánh đối tượng thay vì dispatch phương thức
<=>cho đối tượng Fixnum/Float/String.”
Đây là benchmark của tôi.
Ruby 2.4.2:
Enumerable#sort_by 2.395k (± 6.7%) i/s - 11.952k in 5.014422s Enumerable#min_by 8.244k (± 6.1%) i/s - 41.405k in 5.042327s Enumerable#max_by 8.053k (± 6.7%) i/s - 40.180k in 5.015375s
Ruby 2.5:
Enumerable#sort_by 5.914k (± 6.7%) i/s - 29.786k in 5.062584s Enumerable#min_by 15.668k (± 3.0%) i/s - 78.888k in 5.039748s Enumerable#max_by 15.544k (± 2.3%) i/s - 78.408k in 5.046709s
Đó là cải tiến ~50% 🙂
Range#min & Range#max
Tôi có thêm 2 tối ưu hiệu suất cho bạn!
Một về Range#min & Range#max.
Đây là benchmark:
Ruby 2.4.2
Range#min 7.976M (± 3.0%) i/s - 39.950M in 5.013242s Range#max 7.996M (± 3.4%) i/s - 40.059M in 5.015984s
Ruby 2.5
Range#min 13.154M (± 3.0%) i/s - 65.731M in 5.002094s Range#max 13.021M (± 2.6%) i/s - 65.202M in 5.010924s
Tìm commit tại đây.
Cải tiến String#scan
Theo commit message cải tiến 50% cho mẫu chuỗi & 10% cho mẫu regex.
Hãy xem benchmark!
Ruby 2.4.2
String#scan - String pattern 1.367M (±19.8%) i/s - 6.458M in 4.982047s String#scan - Regex pattern 1.228M (±17.0%) i/s - 5.881M in 4.983943s
Ruby 2.5
String#scan - String pattern 3.944M (±24.4%) i/s - 17.739M in 4.977417s String#scan - Regex pattern 1.696M (±17.4%) i/s - 8.103M in 4.982614s
Happy faster scanning!
Tóm tắt
Bạn đã học về tối ưu mới trong Ruby 2.5, phát hành ngày 25/12.
Các tối ưu về nội suy chuỗi, phương thức Enumerable, String#prepend, String#scan & Range#max / Range#min.
Hy vọng bạn thích bài viết!
Đừng quên chia sẻ bài viết trên mạng xã hội yêu thích 🙂