.each循环中的Ruby性能

时间:2012-12-30 22:11:50

标签: ruby loops

考虑以下两个红宝石代码

示例1

name = user.first_name
round_number = rounds.count
users.each do |u|
  puts "#{name} beat #{u.first_name} in round #{round_number}"
end

示例2

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?

2 个答案:

答案 0 :(得分:2)

示例1将运行得更快,因为first_name()仅被调用一次,并且它的值存储在变量中。

在示例2中,Ruby不会自动记住此值,因为each()循环的迭代之间的值可能已更改。

因此,如果期望在不返回值的情况下多次使用它们,则应明确记住昂贵的计算方法。

在做出像这样的决定时,使用Ruby的Benchmark Module会很有用。如果users中有很多值,或者first_name()计算成本很高,则可能只值得记住。

答案 1 :(得分:2)

如果编译器可以证明该方法没有副作用,则它只能执行此优化。这在Ruby中比大多数语言更难,因为一切都是可变的并且可以在运行时被覆盖。它是否发生是依赖于实现的,但由于在Ruby中很难做到,所以大多数都没有。我实际上不知道在发布这篇文章的时候有什么。