summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-17 07:56:27 +0000
committerhsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-17 07:56:27 +0000
commit15cb9817a234d8b67ae412c8eabda91d46a8ef2c (patch)
tree187d427bef8c1cb7ed3e846a1cf513be6e749744 /lib
parent0c0f75b7983e6083ad21690149bf79ea878c6804 (diff)
Optimize CSV#shift.
[Bug #12373][ruby-core:75462] Patch by Yuki Kurihara. Benchmark: ``` 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 ``` git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58770 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/csv.rb11
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/csv.rb b/lib/csv.rb
index 336b42a697..e7aedc4558 100644
--- a/lib/csv.rb
+++ b/lib/csv.rb
@@ -1874,32 +1874,32 @@ class CSV
parts.each do |part|
if in_extended_col
# If we are continuing a previous column
- if part[-1] == @quote_char && part.count(@quote_char) % 2 != 0
+ if part.end_with?(@quote_char) && part.count(@quote_char) % 2 != 0
# extended column ends
csv[-1] = csv[-1].push(part[0..-2]).join("")
if csv.last =~ @parsers[:stray_quote]
raise MalformedCSVError,
"Missing or stray quote in line #{lineno + 1}"
end
- csv.last.gsub!(@quote_char * 2, @quote_char)
+ csv.last.gsub!(@double_quote_char, @quote_char)
in_extended_col = false
else
csv.last.push(part, @col_sep)
end
- elsif part[0] == @quote_char
+ elsif part.start_with?(@quote_char)
# If we are starting a new quoted column
if part.count(@quote_char) % 2 != 0
# start an extended column
csv << [part[1..-1], @col_sep]
in_extended_col = true
- elsif part[-1] == @quote_char
+ elsif part.end_with?(@quote_char)
# regular quoted column
csv << part[1..-2]
if csv.last =~ @parsers[:stray_quote]
raise MalformedCSVError,
"Missing or stray quote in line #{lineno + 1}"
end
- csv.last.gsub!(@quote_char * 2, @quote_char)
+ csv.last.gsub!(@double_quote_char, @quote_char)
elsif @liberal_parsing
csv << part
else
@@ -2017,6 +2017,7 @@ class CSV
@col_sep = options.delete(:col_sep).to_s.encode(@encoding)
@row_sep = options.delete(:row_sep) # encode after resolving :auto
@quote_char = options.delete(:quote_char).to_s.encode(@encoding)
+ @double_quote_char = @quote_char * 2
if @quote_char.length != 1
raise ArgumentError, ":quote_char has to be a single character String"