From: co000ri@... Date: 2016-05-12T14:12:24+00:00 Subject: [ruby-core:75472] [Ruby trunk Bug#12373] Optimize CSV#shift Issue #12373 has been updated by Yuki Kurihara. File csv-shift-1.patch added File csv-shift-2.patch added File csv-shift-3.patch added I update patches. csv-shift-1.patch: Use **s1.start_with?(s2)** instead of **s1[0] == s2** and use **s1.end_with?(s2)** instead of **s1[-1] == s2**. ~~~ $ 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.417 (�� 0.0%) i/s - 3.000 in 7.189555s new_csv_shift 0.493 (�� 0.0%) i/s - 3.000 in 6.080267s Comparison: new_csv_shift: 0.5 i/s old_csv_shift: 0.4 i/s - 1.18x slower ~~~ csv-shift-2.patch: Use **@double_quote_char** instead of **@quote_char * 2**. ~~~ $ 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.443 (�� 0.0%) i/s - 3.000 in 6.772626s new_csv_shift 0.486 (�� 0.0%) i/s - 3.000 in 6.167382s Comparison: new_csv_shift: 0.5 i/s old_csv_shift: 0.4 i/s - 1.10x slower ~~~ csv-shift-3.patch: Apply both patch csv-shift-1.patch and csv-shift-2.patch. ~~~ $ 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.436 (�� 0.0%) i/s - 3.000 in 6.875614s new_csv_shift 0.567 (�� 0.0%) i/s - 3.000 in 5.292932s Comparison: new_csv_shift: 0.6 i/s old_csv_shift: 0.4 i/s - 1.30x slower ~~~ ---------------------------------------- Bug #12373: Optimize CSV#shift https://bugs.ruby-lang.org/issues/12373#change-58593 * Author: Yuki Kurihara * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.4.0dev (2016-05-11 trunk 54976) [x86_64-darwin15] * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- 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`** call **`String#[]`**, make new `String` object 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 ---Files-------------------------------- csv-benchmark.rb (561 Bytes) old_csv_shift.rb (5.1 KB) new_csv_shift.rb (5.11 KB) string-start_with.rb (215 Bytes) csv-shift.patch (434 Bytes) csv-shift-1.patch (1.15 KB) csv-shift-2.patch (1.2 KB) csv-shift-3.patch (2.13 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: