เวอร์ชัน 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
วิธีการ
ฉันหวังว่าคุณจะสนุกกับโพสต์นี้!
อย่าลืม แชร์โพสต์ บนโซเชียลเน็ตเวิร์กที่คุณชื่นชอบ 🙂