Ruby 关于 + 和 << 操作符

yuest · 2012年02月29日 · 最后由 chitsaou 回复于 2012年03月03日 · 3454 次阅读

比如

'Ruby' + 'Beginner'

'Ruby' << 'Beginner'

是不是 + 是生成新对象而 << 是直接在 'Ruby' 这个对象上加 'Beginner' 然后返回?

哪个效率高?

两个之间相互换用的时候可能出现什么问题?

可以使用 #object_id 方法来看是否是一个对象。

与大多数语言不同,Ruby 的字符串是可变对象。<<在原来的对象上操作,+ 返回新对象。效率如何,可以写 benchmark 看看结果。

@yuest 我记得《Learning Ruby》上是像你说的那样。

1.9.3p125 :003 > Benchmark.measure{ 100000.times { c = 'a' + 'b' }} => 0.050000 0.000000 0.050000 ( 0.045099)

1.9.3p125 :004 > Benchmark.measure{ 100000.times { c = 'a' << 'b' }} => 0.040000 0.000000 0.040000 ( 0.038751)

看来确实

1.9.3p125 :005 > a = 'a' => "a" 1.9.3p125 :006 > b = 'b' => "b" 1.9.3p125 :007 > c = 'a' + 'b' => "ab" 1.9.3p125 :008 > c.object_id => 3560360 1.9.3p125 :009 > a => "a" 1.9.3p125 :010 > d = a << b => "ab" 1.9.3p125 :011 > d.object_id => 3579120 1.9.3p125 :012 > a.object_id => 3579120 1.9.3p125 :013 > a => "ab"

大概理解了

#3 楼 @yuest 从原理上来说, << 应该是会比 + 的性能要好。

  • 有新对象,也就有多余的内存开销,包括分配内存空间,内存交换的耗时等等。 有点类似 gsub 和 gsub!

看看它的 C 怎么实现就知道啦...

<<: http://ruby-doc.org/core-1.9.3/String.html#method-i-3C-3C +: http://ruby-doc.org/core-1.9.3/String.html#method-i-2B

按一下 "click to toggle source" 就看得到 C 代码了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号