Java和JavaScript运算性能对比

来源:互联网 发布:自学单片机编程 编辑:程序博客网 时间:2024/05/24 04:14

Java和JavaScript运算性能对比

以下仅展示两段运算代码的运行时间。Jdk版本为1.7.0_07(64位),JavaScript运行环境为Google Chrome60.0.3112.113(64位)。

超大规模运算(万亿级)

Java代码

public static void calc1(){        float value=0;        long start = System.currentTimeMillis();        for (int i = 0; i < 1000; i++) {            for (int j = 0; j < 1000; j++) {                for (int k = 0; k < 1000; k++) {                    for (int k2 = 0; k2 < 10; k2++) {                        value+=k2*k+j+i;                    }                }            }        }        long end = System.currentTimeMillis();        System.out.println(value);        System.out.println(end - start);    }

JavaScript代码

function calc1(){    var value=0;    var start  = new Date().getTime();    for (var i = 0; i < 1000; i++) {        for (var j = 0; j < 1000; j++) {            for (var k = 0; k < 1000; k++) {                for (var k2 = 0; k2 < 10; k2++) {                    value+=k2*k+j+i;                }            }        }    }    var end = new Date().getTime();    console.log(value);    console.log(end - start);}

运行结果

考虑到寄存器缓存对性能的影响,每个方法都执行6次并去除第一次运行时间后取平均值。Java输出18024ms;Js输出17572ms。
第一次运行时间对比,Java输出18516ms;Js输出23459ms。

小规模运算(百万级以内)

Java代码

public static void calc2(){        double value=0;        float temp1=0;        float temp2=0;        float temp3=0;        float temp4=0;        float temp5=0;        long start = System.nanoTime();        int j=0;        for (int i = 0; i < 1000000; i++,j--) {            temp1+=i*j;            temp2+=i;            temp3+=j;            temp4+=i*i;            temp5+=j*j;        }        value=(temp1-temp2*temp3/1000000)/Math.sqrt((temp4-temp2*temp2/1000000)*(temp5-temp3*temp3/1000000));        long end = System.nanoTime();        System.out.println(value);        System.out.println(end - start);    }

JavaScript代码

function calc2(){    var  value= 0,temp1= 0,temp2= 0,temp3= 0,temp4= 0,temp5= 0,j=0;    var  start = new Date().getTime();    for (var i = 0; i < 1000000; i++,j--) {        temp1+=i*j;        temp2+=i;        temp3+=j;        temp4+=i*i;        temp5+=j*j;    }    value=(temp1-temp2*temp3/1000000)/Math.sqrt((temp4-temp2*temp2/1000000)*(temp5-temp3*temp3/1000000));    var end = new Date().getTime();    console.log(value);    console.log(end - start);}

运行结果

考虑到寄存器缓存对性能的影响,每个方法都执行11次并去除第一次运行时间后取平均值。Java输出6ms;Js输出5ms。
第一次运行时间对比,Java输出7ms;Js输出20ms。

结论

运算级别 超大规模运算(万亿级) 小规模运算(百万级以内) 第一次运行时间 平均运行时间 第一次运行时间 平均运行时间 Java 18516ms 18024ms 7ms 6ms JavaScript 23459ms 17572ms 20ms 5ms

观察发现,不考虑Js本身的解释时间和Java本身的编译时间,Js第一次运行性能较差,但后续运行时性能提升明显,并优于Java;Java第一次运行性能和平均运行时间几乎相等,平均运行时间和Js也几乎相等,但是略差于Js。

附加说明
通常人们口中的解释型语言和编译型语言,在本文所描述的程序测试中是测不出差别的,因为运行到计时代码的时候,解释和编译的环节都已经结束了。可以看到,上文中基于寄存器缓存的“平均运行时间”,Java和Js是基本等同的,可能V8引擎在CPU性能和内存优化上做的更加完善,最终导致平均运行时间Js快于Java。
编译型语言理论上是一次编译终身使用,解释型语言是用一次解释一次,因此现实场景中肯定需要考虑各自的时间消耗。这也决定了两者各自的应用场景:编译型语言常部署于后台服务,而解释性语言常用于前端客户端。我们在做程序语言对比的时候千万不能忽略这些本质的原理。

原创粉丝点击