Ruby 10000 求素数

yakczh · 2015年08月09日 · 最后由 tony612 回复于 2015年08月10日 · 2218 次阅读

ruby2.1 prime.rb

def susu(n)
    result=[];
    for i in 2..n  do
        f=true
        limit=(i**0.5+1).to_i;
        for  j in 2..limitdo
           if i % j ==0 then
            f=false;break;
           end
        end
        if(f) then
        result.push(i);
        end
    end
    return result
end
start = Time.new
out=  susu(10000)
puts (Time.new-start).to_f
# puts out.length

nodejs v0.10.31 prime.js

function sushu(n){
    var result=[];
    for(var i=2;i<=n;i++){
        var f=true;
        var limit=parseInt( Math.pow(i,0.5)+1);
        for(var j=2;j<=limit;j++){
           if (i%j==0){
                f=false;
                break;
            }
        }
        if (f){
            result.push(i);
        }
    }
    return result;//#print_r($result);
}
var start=(new Date()).getTime();
var b=sushu(10000);
console.log( ((new Date()).getTime()-start)/1000);

运行时间

测试程序

h={:ruby=>'prime.rb',:node=>'prime.js'}
result={}
h.map { |k,v| result[k]=[] }
h.each do |runtime,file|
   cmd=" #{runtime} #{file} "
   (1..10).each do |runs |
     #puts cmd
     IO.popen(cmd) do |f| time= f.gets
        result[runtime].push(time.chomp.to_f)
     end
   end
end
puts result
result.each do |lang,total|
   print lang,9.chr,  total.inject{ |sum, el| sum + el }.to_f / total.size,10.chr
end

运行结果 ruby 0.027541700000000002 node 0.0215

ruby 和 nodejs 速度相关并不大

没有意义的比较。。。

<?php
function  sushu($n){
    $result=[];
    for($i=2;$i<=$n;$i++ ){
        $f=true;
        $limit=intval(pow($i,0.5)+1);
        #printf("\n".' %s -> %s ',$i,$limit);
        for ( $j=2;$j<= $limit; $j++){
            if ($i%$j==0){
                $f=false;
                break;
            }
        }
        if ($f){
            $result[]=$i;
        }
    }
    return $result;#print_r($result);
}
$start=microtime(true);
$result=sushu(10000);
echo microtime(true)-$start;
echo "\n";
#print_r(count($result));
#print_r($result);

再来个 php 的就有意义了 运行结果 ruby 0.0276356 node 0.022399999999999996 php 0.018055391311645498

php 果然是最好的语言

把 ruby 这么简约的语言写成这样的, 简直不可饶恕.

require 'prime'
Prime.take_while{|p| p < 10000}

在我电脑上楼主 ruby 代码耗时 0.0156 换成 (x..y).each 形式

def susu(n)
    result=[];
    (2..n).each do |i|
        f=true
        limit=(i**0.5+1).to_i;
        (2..limit).each do |j|
          if i % j ==0 then
            f=false;break;
          end
        end
        result<<i if f
    end
    result
end
start = Time.new
out=  susu(10000)
puts (Time.new-start).to_f

耗时 0.0312,区别还是蛮大的。我的习惯循环都是用 (x..y).each{}、n.times{}这类形式,知道性能差,没想到能差一倍。for 循环都忘了怎么写了。 我前一阵写的

def sushu(from,to)
  count=0
  (from..to).each do |i|
    h=i/2
    r=true
    h.times{|x|r=false if i%(x+1)==0 and (x+1)!=1} if h>0
    count+=1 if r
  end
  count
end

耗时两秒多,更惨不忍睹。

#4 楼 @luikore 不要把小朋友带坏了!

#4 楼 @luikore 我就知道,ruby 才是最好的语言 😏

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册