Các phiên bản Ruby mới tiếp tục được cải thiện và Ruby 2.5 cũng không khác gì.
Ruby 2.5 giới thiệu những tối ưu hóa này:
- Nội suy chuỗi sẽ nhanh hơn khoảng 72% khi tạo một chuỗi lớn
- Chuỗi # thêm vào trước sẽ nhanh hơn khoảng 42% nếu chỉ đưa ra một đối số
- Enumerable # sort_by, Enumerable # min_by &Enumerable # max_by sẽ nhanh hơn khoảng 50%
Hãy xem một số điểm chuẩn!
Hiệu suất nội suy chuỗi
Tôi đã lấy mã ví dụ trong thông báo cam kết cho tối ưu hóa 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 điểm chuẩn này với các 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 có thể thấy sự khác biệt đối với các chuỗi lớn là khá đáng kể!
String # prepend Performance
Phương thức thêm vào trước cho phép bạn chèn một số văn bản vào trước một mảng.
Ruby 2.5 tối ưu hóa cho trường hợp phổ biến nhất, chỉ thêm một chuỗi vào chuỗi khác.
Đây là kết quả điểm chuẩn.
Kết quả của Ruby 2.4.1:
String#prepend 3.428M (± 3.2%) i/s - 17.159M in 5.011008s
Kết quả của Ruby 2.5:
String#prepend 4.638M (± 3.6%) i/s - 23.276M in 5.025562s
Đó là một cải tiến khá tốt!
Cải tiến hiệu suất có thể đếm được
Một số phương pháp Enumerable đang được nâng cấp hiệu suất.
Tính năng tối ưu hóa cụ thể này hoạt động vì nó bỏ qua phương thức điều phối cho <=>
phương pháp.
Như được mô tả trên thông báo cam kết:
"Sử dụng OPTIMIZED_CMP () để so sánh các đối tượng thay vì
<=>
điều phối phương thức cho đối tượng Fixnum / Float / String. "
Đây là kết quả điểm chuẩn 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à khoảng cải thiện 50% 🙂
Phạm vi # tối thiểu &Phạm vi # tối đa
Tôi có hai cách tối ưu hóa hiệu suất bổ sung cho bạn!
Một là về các phương pháp Range # min &Range # max.
Dưới đây là các điểm chuẩn:
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 cam kết tại đây.
Cải thiện chuỗi # quét
Theo thông báo cam kết, điều này cải thiện hiệu suất lên 50% đối với mẫu chuỗi và 10% đối với mẫu regex.
Hãy xem xét các điểm chuẩn!
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
Chúc bạn quét nhanh hơn!
Tóm tắt
Bạn đã biết về các tối ưu hóa mới trong Ruby 2.5, sẽ được phát hành vào ngày 25 tháng 12.
Những tối ưu hóa này là về nội suy chuỗi, các phương pháp có thể đếm được, String#prepend
, String#scan
phương pháp &Range#max
/ Range#mix
phương pháp.
Tôi hy vọng bạn thích bài đăng này!
Đừng quên chia sẻ bài đăng trên các mạng xã hội yêu thích của bạn 🙂