java,javascript,groovy和Rhino 的运行效率到底相差的有多远?
2005-07-13 18:11
591 查看
我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
=0;
while(i
<q)
{
i
= i
+1;
if (check(n))
{
scan(n+1);
}
}
}
private static boolean check(int n)
{
for(int j=0;j<n;j++)
{
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
=0
while(i
<q)
{
i
= i
+1
if (check(n))
{
scan(n+1)
}
}
}
function check(n)
{
for (var j=0; j<n;j++)
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
=0
while(i
<q)
{
i
= i
+1
if (check(n))
scan(n+1)
}
}
def check(n)
{
if (n>0)
for (j in 0..<n)
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
=0
while(i
<q)
{
i
= i
+1
if (check(n))
{
scan(n+1)
}
}
}
function check(n)
{
for (var j=0; j<n;j++)
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
|| i[j]-i
==j-n || i[j]-i
==n-j )
return false
return true
}
改为
function check(n){
for (var j=0,c=i
,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下面没有那么突出,但也明显也快了不少。
在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
=0;
while(i
<q)
{
i
= i
+1;
if (check(n))
{
scan(n+1);
}
}
}
private static boolean check(int n)
{
for(int j=0;j<n;j++)
{
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
=0
while(i
<q)
{
i
= i
+1
if (check(n))
{
scan(n+1)
}
}
}
function check(n)
{
for (var j=0; j<n;j++)
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
=0
while(i
<q)
{
i
= i
+1
if (check(n))
scan(n+1)
}
}
def check(n)
{
if (n>0)
for (j in 0..<n)
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
=0
while(i
<q)
{
i
= i
+1
if (check(n))
{
scan(n+1)
}
}
}
function check(n)
{
for (var j=0; j<n;j++)
if (i[j]==i
|| i[j]-i
==j-n || i[j]-i
==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
|| i[j]-i
==j-n || i[j]-i
==n-j )
return false
return true
}
改为
function check(n){
for (var j=0,c=i
,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下面没有那么突出,但也明显也快了不少。
相关文章推荐
- 采用Rhino在JAVA中运行JavaScript
- JavaScript 以及javaquery 函数自动加载运行
- 纯java 的javascript引擎:rhino
- 提高java代码运行效率(5)
- Java 利用脚本API运行Groovy脚本的方式
- 用JavaScript编写JVM可成功运行Java程序
- rhino-java中调用javascript
- java监测方法运行时间/效率方法
- JAVA嵌入运行Groovy脚本
- Java直接运行JavaScript代码或js文件
- java技巧--提高代码运行效率
- Rhino -- 基于java的javascript实现
- Java 6 中也可以运行 javascript 喽 (转)
- Embed JavaScript in Android Java Code with Rhino
- 【Java】深深跪了,OJ题目Java与C运行效率对比(附带清华北大OJ内存计算的对比)
- java 性能优化:提升 java 代码的运行效率
- 在Java中运行javascript脚本示例
- java 运行javascript脚本大全
- 学习java中的几个Map-我们到底能走多远系列(27)
- Java基础学习总结(72)——提升 java 代码的运行效率