在Ruby中构建字符串的最快方式是什么?

前端之家收集整理的这篇文章主要介绍了在Ruby中构建字符串的最快方式是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Ternary operator年,一个想加入[“foo”,“bar”,“baz”]的人用逗号和“和”引用 The Ruby Cookbook

If efficiency is important to you,
don’t build a new string when you can
append items onto an existing string.
[And so on]… Use str << var1 << ‘ ‘
<< var2 instead.

但是这本书是在2006年写的.

在Ruby的所有主要实现中,使用附加(即<<)仍然是构建一个较小字符串数组的大字符串的最快方式.

解决方法

可以使用Array#join,而String#<<当你不能. 使用String#的问题是它必须创建一个中间(不需要的)字符串对象,而String#<<突变原始字符串.以下是通过Array#join,String#和String#连接1000个字符串的时间结果(以秒为单位),“,”1,000次.
  1. Ruby 1.9.2p180 user system total real
  2. Array#join 0.320000 0.000000 0.320000 ( 0.330224)
  3. String#+ 1 7.730000 0.200000 7.930000 ( 8.373900)
  4. String#+ 2 4.670000 0.600000 5.270000 ( 5.546633)
  5. String#<< 1 1.260000 0.010000 1.270000 ( 1.315991)
  6. String#<< 2 1.600000 0.020000 1.620000 ( 1.793415)
  7.  
  8. JRuby 1.6.1 user system total real
  9. Array#join 0.185000 0.000000 0.185000 ( 0.185000)
  10. String#+ 1 9.118000 0.000000 9.118000 ( 9.118000)
  11. String#+ 2 4.544000 0.000000 4.544000 ( 4.544000)
  12. String#<< 1 0.865000 0.000000 0.865000 ( 0.866000)
  13. String#<< 2 0.852000 0.000000 0.852000 ( 0.852000)
  14.  
  15. Ruby 1.8.7p334 user system total real
  16. Array#join 0.290000 0.010000 0.300000 ( 0.305367)
  17. String#+ 1 7.620000 0.060000 7.680000 ( 7.682265)
  18. String#+ 2 4.820000 0.130000 4.950000 ( 4.957258)
  19. String#<< 1 1.290000 0.010000 1.300000 ( 1.304764)
  20. String#<< 2 1.350000 0.010000 1.360000 ( 1.347226)
  21.  
  22. Rubinius (head) user system total real
  23. Array#join 0.864054 0.008001 0.872055 ( 0.870757)
  24. String#+ 1 9.636602 0.076005 9.712607 ( 9.714820)
  25. String#+ 2 6.456403 0.064004 6.520407 ( 6.521633)
  26. String#<< 1 2.196138 0.016001 2.212139 ( 2.212564)
  27. String#<< 2 2.176136 0.012001 2.188137 ( 2.186298)

以下是基准代码

  1. WORDS = (1..1000).map{ rand(10000).to_s }
  2. N = 1000
  3.  
  4. require 'benchmark'
  5. Benchmark.bmbm do |x|
  6. x.report("Array#join"){
  7. N.times{ s = WORDS.join(',') }
  8. }
  9. x.report("String#+ 1"){
  10. N.times{
  11. s = WORDS.first
  12. WORDS[1..-1].each{ |w| s += ","; s += w }
  13. }
  14. }
  15. x.report("String#+ 2"){
  16. N.times{
  17. s = WORDS.first
  18. WORDS[1..-1].each{ |w| s += "," + w }
  19. }
  20. }
  21. x.report("String#<< 1"){
  22. N.times{
  23. s = WORDS.first.dup
  24. WORDS[1..-1].each{ |w| s << ","; s << w }
  25. }
  26. }
  27. x.report("String#<< 2"){
  28. N.times{
  29. s = WORDS.first.dup
  30. WORDS[1..-1].each{ |w| s << "," << w }
  31. }
  32. }
  33. end

Ubuntu在RVM下获得的结果. Ruby上的RubyInstaller的Ruby 1.9.2p180的结果与上述1.9.2类似.

猜你在找的Ruby相关文章