测试一下本地js、浏览器中的js以及ruby对于类似算法的性能。结果有些意外:浏览器js最快,本地其次当相差很小;ruby最慢而且不是一个数量级的;

因为写的匆忙,可能有重大问题没能看出来,请各位高人不吝赐教。

程序计算小于给定数n的最大素数,代码均未作优化,我们依次来看:

首先是浏览器的:

<!DOCTYPE html>
<html>
<head>
    <title>sieve suanfa</title>
    <script src="sieve.js" type="text/javascript"></script>
    <script type="text/javascript">
        window.onload = function(){
            btn_n.onclick = function(){
                var i = parseInt(n.value);
                if(isNaN(i))
                    result.innerHTML = "must input a number";
                else if(i <= 0)
                    result.innerHTML = "must input + number";
                else{
                    var start = new Date().getTime();
                    var max_p = sieve(i);
                    var spend = new Date().getTime() - start;
                    result.innerHTML = "max_p is : " + max_p + "(take " + spend + "ms)";
                }
            }
        }
    </script>
    <style type="text/css">
        #result{
            color: red;
            font-weight: bold;
        }
    </style>
</head>
<body>
<h1>Sieve Suanfa</h1>
<label for="n">input n : </label>
<input type="text" id="n" />
<input type="button" id="btn_n" value="ret max p" />
<label id="result"></label>
</body>
</html>

其中的sieve函数和下面的sieve一致。计算1千万300ms左右,1亿4000ms左右

下面是node.js本地的测试:

#!/usr/bin/node

var path = require("path");
//return max su shu but < n
function sieve(n){
    var a = new Int8Array(n+1);
    var max = Math.floor(Math.sqrt(n));
    var p = 2;
    while(p <= max){
        for(var i=2*p;i<=n;i+=p)
            a[i] = 1;
        while(a[++p]); /* empty */
    }
    while(a[n]) n--;
    return n;
}

//0:node , 1:sieve_node.js , 2:n
if(process.argv.length < 3){
    console.log("must input n value like : " + path.basename(process.argv[1]) + " 1000");
    return;
}

var i = parseInt(process.argv[2]);
if(isNaN(i))
    console.log("must input a number");
else if(i < 0)
    console.log("must input + number");
else{
    var start = new Date().getTime();
    var max_p = sieve(i);
    var end = new Date().getTime() - start;
    console.log("max p is " + max_p + "(take " + end + " ms)");
}

测试结果和浏览器js类似,不过前者在多次计算1亿后会发生脚本无响应的情况,后者一直很稳定。

最后是ruby的测试:

#!/usr/local/bin/ruby

def sieve(n)
    a = Array.new(n+1);
    max = Math.sqrt(n).to_i;
    p = 2;
    while p<=max  do
        i = 2*p
        while i<=n do
            a[i] = 1
            i+=p
        end
        while a[p+=1] == 1 do end
    end
    while a[n] do n-=1 end
    n
end

x = ARGV[0].to_i
if x == 0
    puts "must input a number"
elsif x < 0
    puts "must input + number"
else
    start = Time.now.to_f
    max_p = sieve(x)
    _end = Time.now.to_f - start
    puts "max p is #{max_p} (take #{_end*1000} ms)"
end

计算1千万将近2秒,1亿超过20秒。当然ruby肯定有优化空间,在这里不展开发挥了。

javascript、ruby和C性能一瞥(1)的更多相关文章

  1. javascript、ruby和C性能一瞥(3) :上汇编

    在博文(1)和(2)里分别用了4中方式写一个素数筛选的算法,分别是javascript in browser.node.js.ruby和c:最终的结果是c最快,node.js其次,js in b虽然也 ...

  2. javascript、ruby和C性能一瞥(2)

    好吧,最后让我们用C来实现,看看再能榨取多少性能.注意我没有改变算法,C的算法和之前的3种都是基本相同的: #include <stdio.h> #include <stdlib.h ...

  3. JavaScript数据存取的性能问题

    JavaScript中四种基本的数据存取位置: 字面量:只代表自身 字符串.数字.布尔值.对象.函数.数组.正则,以及null和undefined    快 本地变量:var定义的    快 数组元素 ...

  4. JavaScript代码规范和性能整理

    性能 Js在性能方面有多要注意的地方: 避免全局查找 Js性能优化最重要的就是注意全局查找,因为作用域的查找是先找局部作用域在没有找到之后在去上一级作用域查找直到全局作用域,所以全局作用域查找的性能消 ...

  5. (转)Javascript的DOM操作 - 性能优化

    转载:https://my.oschina.net/blogshi/blog/198910 摘要: 想稍微系统的说说对于DOM的操作,把Javascript和jQuery常用操作DOM的内容归纳成思维 ...

  6. JavaScript实现元素拖动性能优化

    前言:前几天没事干写了个小网站,打算用原生的javascript实现元素的拖动,但是事情并没有想象的那么顺利,首先是实现了拖动的元素卡的不能再卡,简直不能够,上图~~ 看见没?这就是效果,简直让人欲哭 ...

  7. javascript 作用域链及性能优化

    在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象.函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性.其中一个内部属 ...

  8. 学习javascript总结下来的性能优化的小知识(一)

    http://www.cnblogs.com/ctriphire/p/4115525.html http://www.cnblogs.com/xjchenhao/archive/2012/10/22/ ...

  9. JavaScript 总结几个提高性能知识点

    前段时间花时间看了大半的<High Performance JavaScript>这本书啊,然后就开始忙项目了,庆幸最忙的一周已经熬过去了.由于空不出时间,这个月写的学习笔记也不多,忙完最 ...

随机推荐

  1. 自己写一个网页版的Markdown实时编辑器

    这几天忙着使用Python+Django+sqlite 搭建自己的博客系统,但是单纯的使用H5的TextArea,简直太挫了有木有.所以,就想模仿一下人家内嵌到网页上的Markdown编辑器,从而让自 ...

  2. FFmpeg源代码简单分析:avcodec_encode_video()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  3. mapdb的一些性能测试

    jdk1.6,8g,64位,Intel Core i5-4210U CPU @ 1.70GHz 2.40GHz 使用memorydb 100个htreemap,每个htreemap对应50条线程操作, ...

  4. React Native网络请求

    很多移动应用都需要从远程地址中获取数据或资源.你可能需要给某个REST API发起POST请求以提交用户数据,又或者可能仅仅需要从某个服务器上获取一些静态内容--以下就是你会用到的东西.新手可以对照这 ...

  5. 卸载linux后出现grub rescue怎么办?

    原文转自:http://zhidao.baidu.com/link?url=9e2mOttgV0IJDMml58SFbV-7XOvVzp2jR5l1n3ltFOzX1XAcp5-t-QQPc-Nozy ...

  6. Git Bash+EGit在项目中配合使用最常用方法总结(根据场景使用)

    最近在项目中使用Git进行代码管理,之前一直用SVN进行管理,现在谈一谈Git在项目中如何与EGit插件配合使用,高效同步开发. 使用过SVN一段时间的人,初识Git一定感觉很别扭,发现会遇到各种各样 ...

  7. 记录最近的几个bug

    记录最近出的几个bug connection reset by peer 最近服务器经常性的出现connection reset by peer的错误,开始我们只是以为小概率的网络断开导致的,可是随着 ...

  8. 利用openssl管理证书及SSL编程第1部分: openssl证书管理

    利用openssl管理证书及SSL编程第1部分 参考:1) 利用openssl创建一个简单的CAhttp://www.cppblog.com/flyonok/archive/2010/10/30/13 ...

  9. Web Service进阶(六)SOAPBinding绑定方式异常 is not found. Have you run APT to generate them

    当在类中填充相应方法时,提示如下错误: 出现以上错误的原因就是在注解中没有添加@SOAPBinding(style=SOAPBinding.Style.RPC)这句话.估计也与JDK的版本相关,这方面 ...

  10. 类装载器DexClassLoader (android内核剖析)

    在java环境中,有个概念叫做"类装载器",其作用是动态装载Class文件.标准的java SDK中有一个ClassLoader类,借助它可以装载 想要的Class文件,每个Cla ...