ruby中的while与map效率比对

2011-09-24  王少平 

ruby中有很多很炫的方法,可以让我们的代码风格更加优雅,但是可能因此牺牲了性能,在这里用两个求素数的做一下比较:
脚本一,使用while循环:
$arr1=[]
$arr1[0]=2
t = Time.now
def add_prime(n)
 # 3.step(n,2){|num|$arr1<<num if is_prime?num} # 下面的while循环可以用这段代替,对性能没有大的影响
 
 i = 3
 while i<=n
  $arr1<<i if is_prime? i
  i += 2
 end
end
def is_prime?(number)
 j = 0
 while $arr1[j]*$arr1[j]<=number
  return false if number % $arr1[j] == 0
  j += 1
 end
 
 return true
end
add_prime(50000)
puts "用时:#{Time.now-t}"
 
脚本二,使用map遍历:
$arr = []
$arr[0]=2
t = Time.now
def get_prime(n) 
 3.step(n,2){|i| $arr<<i if check_prime?(i)}
end
def check_prime?(number)
 $arr.map{|a|
  if a**2<=number
   return false if number % a == 0
  end
 }
 
 return true
end
get_prime(50000)
puts "用时:#{Time.now-t}"
 
两段脚本在我机器多次运行,时长分别为:
脚本一: 0.0625
脚本二: 3.453125
 
这个差别还是挺大的!
450°/4508 人阅读/0 条评论 发表评论

登录 后发表评论