Project

General

Profile

Bug #12373

Updated by nobu (Nobuyoshi Nakada) almost 8 years ago

I think that **`str1.start_with?(str2)`** **str1.start_with?(str2)** is faster than **`str1[0] **str1[0] == str2`**. str2**. 
 Because **`str1.start_with?(str2)`** **str1.start_with?(str2)** just call **`String#start_with?`**, **String#start_with?**, But **`str1[0] **str1[0] == str2`** str2** call **`String#[]`**, **String#[]**, make new `String` String object and call **`String#==`**. **String#==**. 

 (The patch is csv-shift.patch) 

 Benchmark results. 

 csv-benchmark.rb make temp CSV file and call **`CSV#each`** **CSV#each** method(inner call **`CSV#shift`**) **CSV#shift**) 

 ~~~ 
 $ ruby csv-benchmark.rb 
 Warming up -------------------------------------- 
        old_csv_shift       1.000    i/100ms 
        new_csv_shift       1.000    i/100ms 
 Calculating ------------------------------------- 
        old_csv_shift        0.444    (± 0.0%) i/s -        3.000    in     6.759200s 
        new_csv_shift        0.479    (± 0.0%) i/s -        3.000    in     6.264069s 

 Comparison: 
        new_csv_shift:          0.5 i/s 
        old_csv_shift:          0.4 i/s - 1.08x slower 
 ~~~ 

 string-start_with.rb is a micro benchmark for **`str1[0] **str1[0] == str2`** str2** and **`str1.start_with?(str2)`** **str1.start_with?(str2)** 

 ~~~ 
 $ ruby string-start_with.rb 
 Warming up -------------------------------------- 
            a[0] == b      90.881k i/100ms 
     a.start_with?(b)     115.557k i/100ms 
 Calculating ------------------------------------- 
            a[0] == b        1.836M (± 3.8%) i/s -        9.179M in     5.006568s 
     a.start_with?(b)        3.183M (± 4.2%) i/s -       15.947M in     5.018654s 

 Comparison: 
     a.start_with?(b):    3183386.0 i/s 
            a[0] == b:    1836263.5 i/s - 1.73x slower 
 ~~~ 

 Of course $ make test-all TESTS="test/csv/*" passed 

Back