Issue #12373 has been updated by hsbt (Hiroshi SHIBATA).
File csv-shift-hsbt.path added
Target version set to 2.5
@ksss
I confirm your patch and benchmark results.
```
Warming up --------------------------------------
csv_shift 1.000 i/100ms
new_csv_shift 1.000 i/100ms
Calculating -------------------------------------
csv_shift 1.192 (¡Þ 0.0%) i/s - 6.000 in 5.034250s
new_csv_shift 1.527 (¡Þ 0.0%) i/s - 8.000 in 5.243446s
Comparison:
new_csv_shift: 1.5 i/s
csv_shift: 1.2 i/s - 1.28x slower
```
Should we use `@double_quote_char` instead of `@quote_char` ?
your patch named csv-shift-3.patch is only assign `@double_quote_char`. It's not used in csv.rb
I update replacement it in csv.rb and attched csv-shift-hsbt.patch.
Can you confirm it? If it's ok, I will merge it.
----------------------------------------
Bug #12373: Optimize CSV#shift
https://bugs.ruby-lang.org/issues/12373#change-64852
* Author: ksss (Yuki Kurihara)
* Status: Assigned
* Priority: Normal
* Assignee: hsbt (Hiroshi SHIBATA)
* Target version: 2.5
* 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)
csv-shift-hsbt.path (2.05 KB)
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>