这两个代码示例之间是否存在性能差异?

时间:2010-07-13 03:48:16

标签: ruby-on-rails ruby

下面的代码似乎做了同样的事情,但是一个有比另一个更好的性能,还是它们是相同的?谢谢。

代码1:

<% @posts.each do |post| -%>  
post.doSomething
<% end -%>

代码2:

<% for post in @posts %>
post.doSomething
<% end -%>

6 个答案:

答案 0 :(得分:5)

广泛采用的方法是使用each。不仅因为更多Ruby-ish,而且因为来自Ruby 1.8.7+ each返回一个Enumerator对象,可用于执行 magic 很酷的功能。< / p>

另外:当有疑问时,基准 **

require "benchmark"

array = [*1..100_000]

Benchmark.bm(11) do |x|
  x.report("for .. in") { array.each{ |i| i.succ } }
  x.report("each")      { for i in array; i.succ; end }
end

** 如果您发现代码中的0.00000001纳秒性能增益是相关的,那么您可能不应该使用Ruby。

答案 1 :(得分:4)

在第一个中,您要传入要针对数组中的每个元素执行的代码。在第二个,你循环代码和做东西。在功能上,没有区别。在习惯上,rubyists每次都会选择函数式编程风格的API。这是一种文化的东西。

说到性能,除非有问题,否则你不应该出汗微观优化。在您实际运行探查器并找出代码实际上很慢的位置之前,任何以毫秒为单位测量的内容都不应被视为问题。大多数代码不需要以最高效率运行,开发人员的工作效率和可维护性更为重要。

答案 2 :(得分:0)

它们非常相似,对性能的影响可以忽略不计。只是为了你喜欢的风格,并保持一致。

答案 3 :(得分:0)

表现明智 - 差异应该可以忽略不计,不用担心...但是,每个人的变量范围都有所不同,请参阅https://gist.github.com/b07f6a11500693a2e181

答案 4 :(得分:0)

我认为两者都没有任何性能差异。

当@posts数组为null或空白时,

@ posts.each会出错 而对于... in不会给出错误。

因此,如果你正在使用每个,你应该像

那样编码
<% unless @posts.blank? %>
   <% @posts.each do |post| -%>  
      post.doSomething
   <% end -%>
<% end %>

答案 5 :(得分:-2)

你可以在里面使用“break”来... ..结束:)