2

考虑以下两个 ruby​​ 代码

示例 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?

4

2 回答 2

2

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

在示例 2 中,Ruby 不会自动记住该值,因为该值可能在循环的迭代之间发生了变化each()

因此,如果期望在不改变返回值的情况下多次使用计算成本高的方法,则应显式记住它们。

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

于 2012-12-30T22:18:52.910 回答
2

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

于 2012-12-30T22:28:02.033 回答