首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ruby中使用单引号比使用双引号有性能上的提升吗?

在ruby中使用单引号比使用双引号有性能上的提升吗?
EN

Stack Overflow用户
提问于 2009-12-03 06:57:33
回答 11查看 25.2K关注 0票数 131

你知道在ruby 1.8和1.9中使用双引号而不是单引号是否会降低性能吗?

所以如果我输入

代码语言:javascript
复制
question = 'my question'

它是不是比

代码语言:javascript
复制
question = "my question"

我想象一下,当ruby遇到双引号时,它会尝试找出某些东西是否需要求值,并且可能会花费一些周期来做这件事。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-12-03 12:17:28

代码语言:javascript
复制
$ ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.0.0]

$ cat benchmark_quotes.rb
# As of Ruby 1.9 Benchmark must be required
require 'benchmark'

n = 1000000
Benchmark.bm(15) do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
end

$ ruby benchmark_quotes.rb 

                      user     system      total        real
assign single     0.110000   0.000000   0.110000 (  0.116867)
assign double     0.120000   0.000000   0.120000 (  0.116761)
concat single     0.280000   0.000000   0.280000 (  0.276964)
concat double     0.270000   0.000000   0.270000 (  0.278146)

注意:我已经对其进行了更新,使其适用于较新的Ruby版本,并清理了头文件,并在速度更快的系统上运行基准测试。

这个答案省略了一些关键点。请特别参阅这些关于interpolation的其他答案,以及使用单引号和双引号时使用there is no significant difference in performance的原因。

票数 89
EN

Stack Overflow用户

发布于 2010-01-23 08:36:37

然而,没有人碰巧测量拼接和插值:

代码语言:javascript
复制
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.6.2]
$ cat benchmark_quotes.rb
require 'benchmark'
n = 1000000
Benchmark.bm do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("assign interp") { n.times do; c = "a string #{'b string'}"; end}
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
end

$ ruby -w benchmark_quotes.rb 
      user     system      total        real
assign single  2.600000   1.060000   3.660000 (  3.720909)
assign double  2.590000   1.050000   3.640000 (  3.675082)
assign interp  2.620000   1.050000   3.670000 (  3.704218)
concat single  3.760000   1.080000   4.840000 (  4.888394)
concat double  3.700000   1.070000   4.770000 (  4.818794)

具体来说,请注意assign interp = 2.62concat single = 3.76。锦上添花的是,我还发现插值比'a' + var + 'b'更具可读性,特别是在空格方面。

票数 35
EN

Stack Overflow用户

发布于 2009-12-04 04:50:30

没有区别--除非你使用的是#{some_var}风格的字符串插值。但是只有当你真的这么做的时候,你才能得到性能上的提升。

Zetetic's示例修改而来:

代码语言:javascript
复制
require 'benchmark'
n = 1000000
Benchmark.bm do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("assign interp") { n.times do; c = "a #{n} string"; end}  
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
  x.report("concat interp") { n.times do; "a #{n} string " + "b #{n} string"; end}
end

输出

代码语言:javascript
复制
               user       system     total    real
assign single  0.370000   0.000000   0.370000 (  0.374599)
assign double  0.360000   0.000000   0.360000 (  0.366636)
assign interp  1.540000   0.010000   1.550000 (  1.577638)
concat single  1.100000   0.010000   1.110000 (  1.119720)
concat double  1.090000   0.000000   1.090000 (  1.116240)
concat interp  3.460000   0.020000   3.480000 (  3.535724)
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1836467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档