10000之内求素数
发布于 9 年前 作者 yakczh 4215 次浏览 最后一次编辑是 8 年前 来自 分享

nodejs 版本

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);

console.log(b.length);

运行时间0.031 php5.6


<?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);

运行时间 0.017982959747314

10 回复

单次比较意义不大,而且你没有说nodejs哪个版本?目前性能差异还是比较大的

nodejs 特点在于IO,不在于cpu运算

我在chrome 里测试的结果。chrome: 44 666666.png

golang 测试结果:
7777777.png

golang 代码:

package main

import (
	"fmt"
	"math"
	"time"
)

func main() {
	start := time.Now()
	result := []int{}
	for i := 2; i < 10000; i++ {
		f := true
		limit := math.Pow(float64(i), 0.5) + 1
		for j := 2; j <= int(limit); j++ {
			if i%j == 0 {
				f = false
				break
			}
		}
		if f == true {
			result = append(result, i)
		}
	}
	duration := time.Since(start)
	fmt.Println(len(result))
	fmt.Printf("times: %v ms", duration.Seconds()*1e6/float64(1000))
}


node版本0.10.33 在我电脑上速度: 0.012 另var start=(new Date()).getTime();上面最好加上console.log(''); 因为https://cnodejs.org/topic/5599743693cb46f578f0a586

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);
}
console.log("\n");
var start=(new Date()).getTime();
var b=sushu(10000);
console.log(( ((new Date()).getTime()-start)/1000)+"\n");
console.log(b.length);

0.005 1228 计算时间前后加个输出就变快了,这是什么原理?

看来这种简单运算并不能作为评价标准,《深入浅出》书中对比的是斐波那契数计算。

傲游截图20150810221450.png 傲游浏览器

@zh-h fib才是简单运算,求素数有函数调用,有逻辑判断,有循环和中断,有数组操作 ,平时写代码也就是这些东西,全部覆盖了

@yakczh 是吗?但是算斐波那契有很多花样。我觉得本题的两个时间可以先赋值,最后才同一显示出来。

回到顶部