Test for Ruby 4.0 performance regression

Compare changes

Choose any two refs to compare.

Changed files
+18 -12
+14
README.md
··· 2 2 3 3 There seems to be some kind of performance regression in Ruby 4.0 which showed up in my project, which I think is centered around regexp matching. I extracted some minimal code from the project, which runs significantly slower on Ruby 4.0 than on 3.4. 4 4 5 + #### First version (commit 20923f0028e2c023bd5e48be5118c5f97f4f243a) 6 + 5 7 Running on my server, with 1000 loops: 6 8 7 9 ``` ··· 23 25 $ RUBYOPT="--enable-yjit" ruby test.rb 1000 24 26 1000 * 940 = 940000 records in 13.457106019 -> 69851.57125706079 records/s 25 27 ``` 28 + 29 + #### Minimal version (commit ccc62810ac635f3250bebe12a08d79ad5d9dd7f5) 30 + 31 + With 2,000,000 loops: 32 + 33 + ``` 34 + $ /tmp/ruby34/bin/ruby test.rb 2000000 0 35 + 2000000 loops in 0.752061 -> 2659358.748824896 loops/s 36 + 37 + $ /tmp/ruby4/bin/ruby test.rb 2000000 0 38 + 2000000 loops in 2.711216 -> 737676.3784220808 loops/s 39 + ```
+4 -12
test.rb
··· 1 1 require 'json' 2 2 3 - REGEXPS = [ 4 - /linux/i, /debian/i, /ubuntu/i, /\bredhat\b/i, /\bRHEL\b/, /\bSUSE\b/, /\bCentOS\b/, /\bopensuse\b/i, 5 - /\bslackware\b/i, /\bKDE\b/, /\bGTK\d?\b/, /#GNOME\b/, /\bGNOME\s?\d+/, /\bkde plasma\b/i, 6 - /apt\-get/, /\bflatpak\b/i, /\b[Xx]org\b/ 7 - ] 3 + regexp = /\bslackware\b/i 4 + test_post = "This isn’t a very long string – but it includes some non-ASCII™ characters…" 8 5 9 - posts = JSON.load(File.read(File.join(__dir__, 'atprotocoldev.json'))) 10 6 loops = ARGV[0].to_i 11 7 12 8 if loops <= 0 ··· 17 13 time_start = Time.now 18 14 19 15 loops.times do 20 - posts.each do |text| 21 - match = REGEXPS.any? { |r| text =~ r } 22 - end 16 + test_post =~ regexp 23 17 end 24 18 25 19 time_end = Time.now 26 - 27 - total = loops * posts.length 28 20 total_time = time_end - time_start 29 21 30 - puts "#{loops} * #{posts.length} = #{total} records in #{total_time} -> #{total / total_time} records/s" 22 + puts "#{loops} loops in #{total_time} -> #{loops / total_time} loops/s"