Project

General

Profile

Bug #12373

Updated by ksss (Yuki Kurihara) almost 8 years ago

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

 (The patch is csv-shift.patch) 

 Benchmark results. 

 csv-benchmark.rb make temp CSV file and call **CSV#each** method(inner call **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] == str2** and **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