考虑以下两个红宝石代码
name = user.first_name
round_number = rounds.count
users.each do |u|
puts "#{name} beat #{u.first_name} in round #{round_number}"
end
users.each do |u|
puts "#{user.first_name} beat #{u.first_name} in #{rounds.count}"
end
对于两段代码想象
#user.rb
def first_name
name.split.first
end
因此,在经典的算法分析中,第一段代码会更高效,但在大多数现代编译语言中,现代编译器会优化第二段代码,使其看起来像第一段,无需优化这样的代码。
ruby会在执行前优化或缓存此代码的值吗?我的ruby代码应该像示例1还是示例2?
答案 0 :(得分:2)
示例1将运行得更快,因为first_name()
仅被调用一次,并且它的值存储在变量中。
在示例2中,Ruby不会自动记住此值,因为each()
循环的迭代之间的值可能已更改。
因此,如果期望在不返回值的情况下多次使用它们,则应明确记住昂贵的计算方法。
在做出像这样的决定时,使用Ruby的Benchmark Module会很有用。如果users
中有很多值,或者first_name()
计算成本很高,则可能只值得记住。
答案 1 :(得分:2)
如果编译器可以证明该方法没有副作用,则它只能执行此优化。这在Ruby中比大多数语言更难,因为一切都是可变的并且可以在运行时被覆盖。它是否发生是依赖于实现的,但由于在Ruby中很难做到,所以大多数都没有。我实际上不知道在发布这篇文章的时候有什么。