下面的代码似乎做了同样的事情,但是一个有比另一个更好的性能,还是它们是相同的?谢谢。
代码1:
<% @posts.each do |post| -%>
post.doSomething
<% end -%>
代码2:
<% for post in @posts %>
post.doSomething
<% end -%>
答案 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”来... ..结束:)