【发布时间】:2015-04-29 23:38:14
【问题描述】:
我必须从大量字符串中删除所有换行符。在对 string.join("\n").split(' ') 和 string.gsub(/\n/, ' ') 进行基准测试时,我发现 split 和 join 方法要快得多,但很难理解为什么。我不明白每次遇到\n 时如何将字符串拆分为数组元素,然后将数组加入新字符串可能比扫描并用' ' 替换每个\n 更快。
sentence = %q[
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae
dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam
est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius
modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima
veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea]
检查以验证两种方法的输出确实相同:
puts sentence.split("\n").join(' ') == sentence.gsub(/\n/, ' ')
#=> true
用于基准测试的脚本:
def split_join_method(string)
start = Time.now;
1000000.times { string.split("\n").join(' ') }
puts "split_join: #{Time.now - start} s"
end
def gsub_method(string)
start = Time.now;
1000000.times { string.gsub(/\n/, ' ') }
puts "gsub: #{Time.now - start} s"
end
5.times do
split_join_method(sentence)
gsub_method(sentence)
end
结果:
#=> split_join: 6.753057 s
#=> gsub: 14.938358 s
#=> split_join: 6.16101 s
#=> gsub: 14.166971 s
#=> split_join: 5.946168 s
#=> gsub: 13.490355 s
#=> split_join: 5.781062 s
#=> gsub: 13.436135 s
#=> split_join: 5.903052 s
#=> gsub: 15.670774 s
【问题讨论】:
-
我不知道为什么 gsub 这么慢,但你会发现
string.tr("\n", " ")比你当前的任何一种方法都快。 -
你也应该尝试一个更大的字符串,否则正则表达式编译很可能会支配 gsub 的运行时间