Project

General

Profile

Bug #19875

Updated by iz (Illia Zub) 8 months ago

`String#count` became slower since Ruby 3.1. Originally found by `@Freaky`: https://github.com/ruby/ruby/pull/4001#issuecomment-1714779781 

 Compared using the [`benchmark-driver` gem](https://github.com/benchmark-driver/benchmark-driver). 

 ``` 
 $ benchmark-driver tmp/string_count_benchmark_driver.yml --rbenv '3.1.1;3.1.4;2.7.2;3.2.2;3.0.6'                                                  
 Calculating ------------------------------------- 
                           3.1.1         3.1.4         2.7.2         3.2.2         3.0.6 
                count      465.804       463.741       865.783       462.711       857.395 i/s -       10.000k times in 21.468251s 21.563768s 11.550239s 21.611783s 11.663235s 

 Comparison: 
                             count 
                2.7.2:         865.8 i/s  
                3.0.6:         857.4 i/s - 1.01x    slower 
                3.1.1:         465.8 i/s - 1.86x    slower 
                3.1.4:         463.7 i/s - 1.87x    slower 
                3.2.2:         462.7 i/s - 1.87x    slower 
 ``` 

 Benchmark: 


 ```yml 
 $ cat ./tmp/string_count_benchmark_driver.yml  
 loop_count: 10_000 
 prelude: | 
   html = "\nruby\n" * 1024 * 1024 
 benchmark: 
   count: html.count($/) 
 ``` 

 --- 

 *Initially, I noticed the difference between `str.count($/)` and `str.lines.size` when working on the performance improvement: https://serpapi.com/blog/lines-count-failed-deployments/*

Back