javascript、ruby和C性能一瞥(1)

简介:

测试一下本地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肯定有优化空间,在这里不展开发挥了。

相关文章
|
4月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
39 1
|
28天前
|
存储 JavaScript 编译器
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!
这款国产中文编程火了!通过文言文编译生成Python、JS、Ruby代码!
|
1月前
|
JavaScript 前端开发
在JavaScript中,如何优化原型链的性能?
在JavaScript中,如何优化原型链的性能?
13 2
|
3月前
|
缓存 JavaScript 前端开发
原生js浪费性能吗?
原生js浪费性能吗?
16 0
|
5月前
|
前端开发 JavaScript UED
JavaScript异步编程:提升性能与用户体验
JavaScript异步编程:提升性能与用户体验
39 1
|
6月前
|
JavaScript 前端开发 网络协议
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(1)
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(1)
|
6月前
|
监控 JavaScript 前端开发
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(2)
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(2)
|
6月前
|
监控 JavaScript 前端开发
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(3)
带你读《现代Javascript高级教程》三十二、Performance API: 提升网页性能的利器(3)
|
7月前
|
JavaScript 前端开发 数据可视化
运行在生产系统中的企业级 JavaScript 应用的性能问题分析指南
运行在生产系统中的企业级 JavaScript 应用的性能问题分析指南
40 0
|
9月前
|
存储 缓存 JavaScript
如何优化 JavaScript 性能:减少重绘与回流
优化 JavaScript 性能是前端开发中非常重要的课题。在本篇博客文章中,我将重点介绍如何减少重绘(Repaint)与回流(Reflow),以提高 JavaScript 在浏览器中的执行效率。我们将深入探讨导致重绘和回流的原因,并提供一些优化技巧和代码示例来改进性能。
168 0