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

相关文章
|
18天前
|
算法 JavaScript 前端开发
垃圾回收机制对 JavaScript 性能的影响有哪些?
【10月更文挑战第29天】垃圾回收机制对JavaScript性能有着重要的影响。开发者需要了解不同垃圾回收算法的特点和性能开销,通过合理的代码优化和内存管理策略,来降低垃圾回收对性能的负面影响,提高JavaScript程序的整体性能。
|
17天前
|
JavaScript 前端开发
利用事件循环提高 JavaScript 程序的性能
本文介绍了事件循环在JavaScript中的工作原理,以及如何通过合理利用事件循环来优化程序性能,包括异步操作、任务优先级和避免阻塞等技巧。
|
5月前
|
JavaScript 前端开发
事件委托是JS技巧,通过绑定事件到父元素利用事件冒泡,减少事件处理器数量,提高性能和节省内存。
【6月更文挑战第27天】事件委托是JS技巧,通过绑定事件到父元素利用事件冒泡,减少事件处理器数量,提高性能和节省内存。例如,动态列表可共享一个`click`事件处理器,通过`event.target`识别触发事件的子元素,简化管理和响应动态内容变化。
48 0
|
2月前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
161 12
|
1月前
|
存储 JavaScript 前端开发
JavaScript数组去重的八种方法详解及性能对比
在JavaScript开发中,数组去重是一个常见的操作。本文详细介绍了八种实现数组去重的方法,从基础的双重循环和 indexOf() 方法,到较为高级的 Set 和 Map 实现。同时,分析了每种方法的原理和适用场景,并指出了使用 Set 和 Map 是目前最优的解决方案。通过本文,读者可以深入理解每种方法的优缺点,并选择最合适的数组去重方式。
68 0
|
3月前
|
缓存 前端开发 JavaScript
超时空加速秘籍:揭秘JavaScript前端开发中的性能魔法,让您的Web应用瞬间穿越到未来!
【8月更文挑战第27天】本文介绍了一系列实用的JavaScript性能优化方法并提供了示例代码,包括减少DOM操作、使用事件委托、避免阻塞主线程、异步加载资源、利用浏览器缓存、代码分割以及使用Service Worker等技术,帮助开发者有效提升Web应用性能和用户体验。
52 2
|
3月前
|
JavaScript 前端开发
深入理解Node.js事件循环及其对后端性能的影响
【8月更文挑战第31天】 本文将带你一探Node.js的核心概念—事件循环,揭示其工作原理及如何影响后端应用的性能。我们将从基础的事件驱动模型出发,通过代码示例和性能分析,展示如何有效利用事件循环来提升应用响应速度和处理能力。
|
5月前
|
缓存 编解码 JavaScript
在JavaScript小游戏开发中,优化游戏性能是非常重要的
【6月更文挑战第16天】JavaScript小游戏性能优化涉及动画流畅度和减少重绘:使用requestAnimationFrame替代定时器;减少DOM操作,利用DocumentFragment或虚拟DOM;Canvas/WebGL高效渲染;压缩图像,使用雪碧图;分层渲染与视口裁剪;Web Workers处理后台计算;缓存计算结果;事件委托;定期性能分析。优化是持续过程,需结合具体需求调整。
70 8
|
4月前
|
JavaScript API 索引
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
70 0
|
4月前
|
JSON JavaScript API
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)
99 0
下一篇
无影云桌面