什么';在Ruby中构建字符串的最快方法是什么?
在中,一个人想加入什么';在Ruby中构建字符串的最快方法是什么?,ruby,string,optimization,Ruby,String,Optimization,在中,一个人想加入[“foo”,“bar”,“baz”],用逗号和“and”表示 如果效率对你很重要, 尽可能不要构建新字符串 将项附加到现有字符串上。 [等等]。。。使用str尽可能使用Array#join和String#如果字符串位的源不是数组怎么办? TLDR即使字符串位的源不是一个巨大的数组,也最好先构造一个数组并使用join+在2.1.1中没有在1.9.3中那么糟糕,但它仍然很糟糕(对于这个用例)。实际上,1.9.3在数组和数组中都稍微快一点。加入和我相信这就是你提出问题的原因。您是否
[“foo”,“bar”,“baz”]
,用逗号和“and”表示
如果效率对你很重要,
尽可能不要构建新字符串
将项附加到现有字符串上。
[等等]。。。使用str尽可能使用Array#join
和String#如果字符串位的源不是数组怎么办?
TLDR即使字符串位的源不是一个巨大的数组,也最好先构造一个数组并使用join<代码>+
在2.1.1中没有在1.9.3中那么糟糕,但它仍然很糟糕(对于这个用例)。实际上,1.9.3在数组和数组中都稍微快一点。加入和我相信这就是你提出问题的原因。您是否在比较@rubyprince:我在第一句中链接了它。这是一个非常容易误导的基准,因为join基准没有枚举开销,因此只有当字符串位的源是一个巨大的数组时,比较才有意义。好的,不要太误导,构造中间数组并对其进行迭代的开销最小。把它放在一个答案里,这样我就可以格式化它了。。。。
WORDS = (1..1000).map{ rand(10000).to_s }
N = 1000
require 'benchmark'
Benchmark.bmbm do |x|
x.report("Array#join"){
N.times{ s = WORDS.join(', ') }
}
x.report("Array#join 2"){
N.times{
arr = Array.new(WORDS.length)
arr[0] = WORDS.first
WORDS[1..-1].each{ |w| arr << w; }
s = WORDS.join(', ')
}
}
x.report("String#+ 1"){
N.times{
arr = Array.new(WORDS.length)
s = WORDS.first
WORDS[1..-1].each{ |w| arr << w; s += ", "; s += w }
}
}
x.report("String#+ 2"){
N.times{
arr = Array.new(WORDS.length)
s = WORDS.first
WORDS[1..-1].each{ |w| arr << w; s += ", " + w }
}
}
x.report("String#<< 1"){
N.times{
arr = Array.new(WORDS.length)
s = WORDS.first.dup
WORDS[1..-1].each{ |w| arr << w; s << ", "; s << w }
}
}
x.report("String#<< 2"){
N.times{
arr = Array.new(WORDS.length)
s = WORDS.first.dup
WORDS[1..-1].each{ |w| arr << w; s << ", " << w }
}
}
x.report("String#<< 2 A"){
N.times{
s = WORDS.first.dup
WORDS[1..-1].each{ |w| s << ", " << w }
}
}
end
user system total real
Array#join 0.130000 0.000000 0.130000 ( 0.128281)
Array#join 2 0.220000 0.000000 0.220000 ( 0.219588)
String#+ 1 1.720000 0.770000 2.490000 ( 2.478555)
String#+ 2 1.040000 0.370000 1.410000 ( 1.407190)
String#<< 1 0.370000 0.000000 0.370000 ( 0.371125)
String#<< 2 0.360000 0.000000 0.360000 ( 0.360161)
String#<< 2 A 0.310000 0.000000 0.310000 ( 0.318130)
user system total real
Array#join 0.090000 0.000000 0.090000 ( 0.092072)
Array#join 2 0.180000 0.000000 0.180000 ( 0.180423)
String#+ 1 3.400000 0.750000 4.150000 ( 4.149934)
String#+ 2 1.740000 0.370000 2.110000 ( 2.122511)
String#<< 1 0.360000 0.000000 0.360000 ( 0.359707)
String#<< 2 0.340000 0.000000 0.340000 ( 0.343233)
String#<< 2 A 0.300000 0.000000 0.300000 ( 0.297420)
WORDS = (1..1000).map{ rand(100000).to_s * (rand(15)+1) }
user system total real
Array#join 0.150000 0.000000 0.150000 ( 0.152846)
Array#join 2 0.230000 0.010000 0.240000 ( 0.231272)
String#+ 1 7.450000 5.490000 12.940000 ( 12.936776)
String#+ 2 4.200000 2.590000 6.790000 ( 6.791125)
String#<< 1 0.400000 0.000000 0.400000 ( 0.399452)
String#<< 2 0.380000 0.010000 0.390000 ( 0.389791)
String#<< 2 A 0.340000 0.000000 0.340000 ( 0.341099)
user system total real
Array#join 0.130000 0.010000 0.140000 ( 0.132957)
Array#join 2 0.220000 0.000000 0.220000 ( 0.220181)
String#+ 1 20.060000 5.230000 25.290000 ( 25.293366)
String#+ 2 9.750000 2.670000 12.420000 ( 12.425229)
String#<< 1 0.390000 0.000000 0.390000 ( 0.397733)
String#<< 2 0.390000 0.000000 0.390000 ( 0.390540)
String#<< 2 A 0.330000 0.000000 0.330000 ( 0.333791)