Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ปรับปรุงประสิทธิภาพใน Ruby 2.5

เวอร์ชัน Ruby ใหม่มีการปรับปรุงอย่างต่อเนื่อง &Ruby 2.5 ก็ไม่ต่างกัน

ทับทิม 2.5 แนะนำการเพิ่มประสิทธิภาพเหล่านี้:

  • การแก้ไขสตริงจะเร็วขึ้นประมาณ 72% เมื่อสร้างสตริงขนาดใหญ่
  • String#prepend จะเร็วขึ้นประมาณ 42% หากให้อาร์กิวเมนต์เพียงอาร์กิวเมนต์เดียว
  • Enumerable#sort_by, Enumerable#min_by &Enumerable#max_by จะเร็วขึ้นประมาณ 50%

มาดูการเปรียบเทียบกันบ้าง!

ประสิทธิภาพการแก้ไขสตริง

ฉันนำโค้ดตัวอย่างในข้อความยืนยันสำหรับการเพิ่มประสิทธิภาพนี้:

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

ฉันใช้เกณฑ์มาตรฐานนี้ด้วยผลลัพธ์ต่อไปนี้

ทับทิม 2.4.1 :

Small string interpolation:  3236291.1 i/s
Large string interpolation:  1711633.4 i/s - 1.89x  slower

ทับทิม 2.5 :

Small string interpolation:  3125175.1 i/s
Large string interpolation:  2555782.6 i/s - 1.22x  slower

อย่างที่คุณเห็นความแตกต่างของสายขนาดใหญ่นั้นค่อนข้างน่าทึ่ง!

String#prepend ประสิทธิภาพ

วิธีการเติมหน้าช่วยให้คุณสามารถแทรกข้อความข้างหน้าอาร์เรย์ได้

Ruby 2.5 เพิ่มประสิทธิภาพสำหรับกรณีทั่วไปส่วนใหญ่ โดยนำหน้าสตริงหนึ่งไปยังอีกสตริงเท่านั้น

นี่คือผลการวัดประสิทธิภาพ

ผลทับทิม 2.4.1:

String#prepend  3.428M (± 3.2%) i/s - 17.159M in   5.011008s

ผลลัพธ์ Ruby 2.5:

String#prepend  4.638M (± 3.6%) i/s - 23.276M in   5.025562s

นั่นเป็นการปรับปรุงที่ดีทีเดียว!

การปรับปรุงประสิทธิภาพที่นับได้

วิธีการแจกแจงสองสามวิธีกำลังได้รับการอัปเกรดประสิทธิภาพ

การเพิ่มประสิทธิภาพเฉพาะนี้ใช้งานได้เพราะข้ามวิธีการจัดส่งสำหรับ <=> วิธีการ

ตามที่อธิบายไว้ในข้อความยืนยัน:

"ใช้ OPTIMIZED_CMP() เพื่อเปรียบเทียบวัตถุแทน <=> วิธีการจัดส่งสำหรับวัตถุ Fixnum/Float/String"

นี่คือผลลัพธ์การเปรียบเทียบของฉัน

ทับทิม 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

ทับทิม 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

นั่นคือการปรับปรุงประมาณ 50% 🙂

ช่วง#นาที &ช่วง#สูงสุด

ฉันมีโบนัสเพิ่มประสิทธิภาพสองอย่างสำหรับคุณ!

หนึ่งคือเกี่ยวกับวิธีการ Range#min &Range#max

นี่คือเกณฑ์มาตรฐาน:

ทับทิม 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

ทับทิม 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

ค้นหาการคอมมิตที่นี่

ปรับปรุงสตริง#scan

ตามข้อความยืนยัน สิ่งนี้ช่วยเพิ่มประสิทธิภาพได้ 50% สำหรับรูปแบบสตริงและ 10% สำหรับรูปแบบ regex

มาดูการวัดประสิทธิภาพกัน!

ทับทิม 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

ทับทิม 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

มีความสุขในการสแกนเร็วขึ้น!

สรุป

คุณได้เรียนรู้เกี่ยวกับการเพิ่มประสิทธิภาพใหม่ใน Ruby 2.5 ซึ่งจะเปิดตัวในวันที่ 25 ธันวาคม

การเพิ่มประสิทธิภาพเหล่านี้เกี่ยวกับการแก้ไขสตริง, เมธอดที่นับได้, String#prepend เมธอด String#scan เมธอด &Range#max / Range#mix วิธีการ

ฉันหวังว่าคุณจะสนุกกับโพสต์นี้!

อย่าลืม แชร์โพสต์ บนโซเชียลเน็ตเวิร์กที่คุณชื่นชอบ 🙂