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循环可以用这段代替,对性能没有大的影响
$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
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}"
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
$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
$arr.map{|a|
if a**2<=number
return false if number % a == 0
end
}
return true
end
get_prime(50000)
puts "用时:#{Time.now-t}"
puts "用时:#{Time.now-t}"
两段脚本在我机器多次运行,时长分别为:
脚本一: 0.0625
脚本二: 3.453125
这个差别还是挺大的!