论坛首页 编程语言技术论坛

慎用for循环

浏览 8670 次
锁定老帖子 主题:慎用for循环
精华帖 (0) :: 良好帖 (5) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-05  

1.for循环会在循环以外的scope创建一个局部变量,看下面代码:

for i in [1,2,3] do
  p i
end #123
p i#3
 

这和each是有区别的,each只是会改变scope外面已存在的局部变量:

[1,2,3].each do |i|
  print i
end
p i#undefined local variable or method `i' for main:Object (NameError)
i=5
[1,2,3].each do |i|
  print i
end
p i#1233

 2.在和Proc结合的时候for循环会出现陷阱:

procs = []
for n in [1, 2, 3] do
procs << Proc.new {puts "#{n}"}
end
[1,2,3].each do |m|
procs << Proc.new {puts "#{m}"}
end
procs.each { |p| p.call }
#结果:
#3
#3
#3
#1
#2
#3

 很显然for的结果出乎我们意料之外。

3.for是用each实现的,并且会在each的scope外创建临时变量。

a=[1,2,3]
def a.each
  puts "call each!"
end
for i in a 
puts i
end
#结果:
#call each!

 4.for循环的速度比each快一点点:

require 'benchmark'
include Benchmark 
n = 500000
array=(1..n).to_a
tmp=nil
Benchmark.benchmark(" "*7 + CAPTION, 7, FMTSTR) do |x|
          tf = x.report("for:")   { for i in array; tmp=i; end }
          tt = x.report("each:") { array.each do |j|  ; tmp=j; end }
end
#结果:
             user     system      total        real
for:     0.172000   0.000000   0.172000 (  0.172000)
each:    0.234000   0.000000   0.234000 (  0.234000)
 
   发表时间:2009-05-05  
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?
0 请登录后投票
   发表时间:2009-05-05  
sofire 写道
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?

在实际中采用哪种方式好些呐?
0 请登录后投票
   发表时间:2009-05-05  
deng131 写道
sofire 写道
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?

在实际中采用哪种方式好些呐?

当然强烈推荐each
并且1.9中 each 中block临时变量可以给同名局部变量进行赋值的特性(bug?)已经除去。
至于性能只是一点细微差别
0 请登录后投票
   发表时间:2009-05-05  
sofire 写道
受教了,原来还有这样的细微差别呢。

4.为什么for比each快些呢?

这个我也不清楚,但是for和each的区别就是在创建变量的方式,我感觉速度差别也是由这个引起的。
0 请登录后投票
   发表时间:2009-05-05  
参看,右上角相关文章,第一条

关于第二点,加一行,就可以理解了
procs = []  

for n in [1, 2, 3] do  
  procs << Proc.new {puts n}  
end  

n = 4

[1,2,3].each do |m|  
  procs << Proc.new {puts m }  
end  
procs.each { |p| p.call }  
0 请登录后投票
   发表时间:2009-05-05  
each 是人民群众喜闻乐见的吊尾 proc,风格归一,行为清楚。
但也正因为 each 是 proc 语法,受 proc 限制。

for in 不是 proc 语法,所以实现上能优化多一点。

我觉得优化瓶颈的时候可以考虑 for,其它时候肯定是 each 好。

http://www.ruby-doc.org/core/classes/Benchmark.html
0 请登录后投票
   发表时间:2009-05-06  
   
0 请登录后投票
   发表时间:2009-05-06  
引用
.在和Proc结合的时候for循环会出现陷阱:

这是个什么原理?
0 请登录后投票
   发表时间:2009-05-07  
wosmvp 写道
参看,右上角相关文章,第一条

关于第二点,加一行,就可以理解了
procs = []  

for n in [1, 2, 3] do  
  procs << Proc.new {puts n}  
end  

n = 4

[1,2,3].each do |m|  
  procs << Proc.new {puts m }  
end  
procs.each { |p| p.call }  

这么说for和while一样都不是一个scope了。
ps:你是想加 m=4吧?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics