Computer >> Máy Tính >  >> Lập trình >> Ruby

Cải tiến hiệu suất trong Ruby 2.5

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 🙂