什么';在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)