分享
 
 
 

java,javascript,groovy和Rhino 的运行效率到底相差的有多远?

王朝html/css/js·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

我author:emu(黄希彤)

Groovy 学习笔记3 运行效率 初识Rhino 中都用8皇后问题来比较java,javascript,groovy和Rhino 的运行效率。一开始考虑到8皇后只有92组解,输出占用的时间应该很少,为了好看就把全部结果打印出来了。

后来因为程序运行的太快,又增加了皇后的数目,用9皇后来测试,这样需要输出352个解了,我仍然没有意识到输出对运行时间的影响。直到今天中午多放了一个皇后的时候,才意识到问题的严重性:java版运行10皇后如果不输出结果只需要30~40毫秒,而输出结果的情况下需要500毫秒左右,输出成了速度瓶颈。把前面的测试全部去掉结果输出部分重新测一遍吧:

java版:

public class queens
{

static int q=10;

static int[] i=new int[q];

static int count=0;

public static void main(String[] args)
{

long t = System.currentTimeMillis();

scan(0);

System.out.println("totle results:"+count);

System.out.println("totle time:"+(System.currentTimeMillis()-t));

}

private static void scan(int n)
{

if (n==q)
{

// for (int k=0;k<q;k++) System.out.print(i[k]+(k==q-1?"\n":","));

count++;

return;

}

i[n]=0;

while(i[n]<q)
{

i[n] = i[n]+1;

if (check(n))
{

scan(n+1);

}

}

}

private static boolean check(int n)
{

for(int j=0;j<n;j++)
{

if (i[j]==i[n] || i[j]-i[n]==j-n || i[j]-i[n]==n-j )
{

return false;

}

}

return true;

}

}

javascript(DHTML)版

<SCRIPT LANGUAGE="JavaScript">

<!--

var q=10

var i=[]

var count=0

var d = new Date();

scan(0)

document.write("totle results:"+count+"<br>")

document.write("time used:"+(new Date()-d)+"<br>")

function scan(n)
{

if (n==q)
{

// document.write(i+"<br>")

count++

return

}

i[n]=0

while(i[n]<q)
{

i[n] = i[n]+1

if (check(n))
{

scan(n+1)

}

}

}

function check(n)
{

for (var j=0; j<n;j++)

if (i[j]==i[n] || i[j]-i[n]==j-n || i[j]-i[n]==n-j )

return false

return true

}

//-->

</SCRIPT>

groovy版

int q=10

int[] i=new int[q]

int count=0

long t = System.currentTimeMillis();

scan(0)

println("totle results:"+count)

println("totle time:"+(System.currentTimeMillis()-t));

def scan(n)
{

if (n==q)
{

// println(i.toList())

count++

return

}

i[n]=0

while(i[n]<q)
{

i[n] = i[n]+1

if (check(n))

scan(n+1)

}

}

def check(n)
{

if (n>0)

for (j in 0..<n)

if (i[j]==i[n] || i[j]-i[n]==j-n || i[j]-i[n]==n-j )

return false

return true

}

javascript(Rhino)版

var q=10

var i=[]

var count=0

var d = new Date();

scan(0)

print("totle results:"+count)

print("time used:"+(new Date()-d))

function scan(n)
{

if (n==q)
{

// print(i)

count++

return

}

i[n]=0

while(i[n]<q)
{

i[n] = i[n]+1

if (check(n))
{

scan(n+1)

}

}

}

function check(n)
{

for (var j=0; j<n;j++)

if (i[j]==i[n] || i[j]-i[n]==j-n || i[j]-i[n]==n-j )

return false

return true

}

其中javascript版由于在IE上运行的时间刚好超过5秒,会收到一个警告,所以是在firefox上测的。

在我的笔记本上测试结果是:

java 版:

---------- run ----------

totle results:724

totle time:40

Normal Termination

输出完成(耗时 0 秒)。

javascript(DHTML)版

totle results:724

time used:4977

groovy版

用groovy命令运行:

---------- run ----------

totle results:724

totle time:31095

Normal Termination

输出完成(耗时 32 秒)。

用groovyconsole运行或者编译成java class后用java命令运行的结果也差不多,都在30~36秒之间。

javascript(Rhino)版

---------- run ----------

totle results:724

time used:3685

Normal Termination

输出完成(耗时 4 秒)。

结果是:Rhino运行javascript脚本比firefox快一点(而firefox似乎又比IE快一点),总的来说,在这个测试上javascript比java慢一个数量级,而groovy则比javascript慢一个数量级author:emu(黄希彤)

再做一点点优化:

function check(n){

for (var j=0; j<n;j++)

if (i[j]==i[n] || i[j]-i[n]==j-n || i[j]-i[n]==n-j )

return false

return true

}

改为

function check(n){

for (var j=0,c=i[n],b=n; j<n;j++,b--){

var d = i[j];

if (d==c) return false

var a = d-c

if (a==b||a==-b) return false

}

return true

}

只是少访问几次数组,少做几次减法运算,好像差别不大。但是由于check函数处在循环的最里层,优化的结果是在Rhino下面算11皇后的时候快了一倍左右,在cscript下面没有那么突出,但也明显也快了不少。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有