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

Ruby 2.5 tăng hiệu suất: Nội suy chuỗi nhanh 72%, Enumerable nhanh 50%

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 🙂