Ruby中的变量分配是否真的很贵,还是优化了链式字符串方法?

Har*_*ber 7 ruby string performance

我为Project Euler编写了以下方法- 问题36.它所做的就是将基数10和基数2中所有小于1,000,000的数字加起来作为回文.

def problem_36
  (1...1_000_000).select do |n|
    n.to_s == n.to_s.reverse && n.to_s(2) == n.to_s(2).reverse
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,这可以工作,并在1秒钟内给出正确的结果.我希望在1秒内得到它,所以我决定减少将数字转换为字符串的次数.所以我做了以下更改:

def problem_36
  (1...1_000_000).select do |n|
    base10 = n.to_s
    base2  = n.to_s(2)
    base10 == base10.reverse && base2 == base2.reverse
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是,这个版本实际上比原版了约50%.所以问题是:分配这两个变量真的很慢吗?或者是Ruby优化链式方法调用?

ste*_*lag 7

在这一行

n.to_s == n.to_s.reverse && n.to_s(2) == n.to_s(2).reverse
Run Code Online (Sandbox Code Playgroud)

如果第一部分是false(Ruby的&&运算符短路,与其&对应部分不同),则不执行第二部分.这节省了很多电话to_s(2).