`
ihuashao
  • 浏览: 4722097 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

author:emu(黄希彤)

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

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


java版:

publicclassqueens{
staticintq=10;
staticint[]i=newint[q];
staticintcount=0;
publicstaticvoidmain(String[]args){
longt=System.currentTimeMillis();
scan(
0);
System.
out.println("totleresults:"+count);
System.
out.println("totletime:"+(System.currentTimeMillis()-t));
}

privatestaticvoidscan(intn){
if(n==q){
//for(intk=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);
}

}

}

privatestaticbooleancheck(intn){
for(intj=0;j<n;j++){
if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j){
returnfalse;
}

}

returntrue;
}

}



javascript(DHTML)版

<SCRIPTLANGUAGE="JavaScript">
<!--
varq=10
vari=[]
varcount=0
vard=newDate();
scan(
0)
document.write(
"totleresults:"+count+"<br>")
document.write(
"timeused:"+(newDate()-d)+"<br>")

functionscan(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)
}

}

}


functioncheck(n){
for(varj=0;j<n;j++)
if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j)
returnfalse
returntrue
}

//-->
</SCRIPT>


groovy版

intq=10
int[]i=newint[q]
intcount=0
longt=System.currentTimeMillis();
scan(
0)
println(
"totleresults:"+count)
println(
"totletime:"+(System.currentTimeMillis()-t));
defscan(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)
}

}

defcheck(n)
{
if(n>0)
for(jin0..<n)
if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j)
returnfalse
returntrue
}


javascript(Rhino)版

varq=10
vari
=[]
varcount
=0
vard
=newDate();
scan(
0)
print(
"totleresults:"+count)
print(
"timeused:"+(newDate()-d))

functionscan(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)
}

}

}


functioncheck(n)
{
for(varj=0;j<n;j++)
if(i[j]==i[n]||i[j]-i[n]==j-n||i[j]-i[n]==n-j)
returnfalse
returntrue
}


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


在我的笔记本上测试结果是:
java 版:
---------- run ----------
totle results:724
totle time:40
Normal Termination
输出完成(耗时 0 秒)。


javascript(DHTML)版
<!--StartFragment -->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下面没有那么突出,但也明显也快了不少。
分享到:
评论

相关推荐

    java、groovy、C#、Javascript性能比较

    java、groovy、C#、Javascript的运行效率到底如何? 通过实验比较,Javascript的运行效率解决java,看来基于javascript的html5前途远大。 C#的Release版的运行性能也相当高,和C++相差不大,值得推荐。 文件内部...

    Java调用Groovy,实时动态加载数据库groovy脚本

    在IT行业中,尤其是在软件开发领域,灵活性和动态性是至关重要的。Java作为一种广泛使用的静态类型编程语言...通过结合Java的稳定性和Groovy的动态性,我们可以构建出更适应变化的系统,提升开发效率和系统的可维护性。

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    Java中使用Groovy的三种方式

    本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...

    SpringBoot-Gradle-Maven-Java-Groovy

    SpringBoot、Gradle、Maven、Java和Groovy是Java生态系统中的重要组成部分,它们在现代软件开发中扮演着至关重要的角色。这篇详细的知识点解析将深入探讨这些技术及其相互关系。 1. **SpringBoot**: SpringBoot是...

    hugo110-java_run_groovy-master_java_

    - **IDE支持**:像IntelliJ IDEA和Eclipse这样的Java IDE都有对Groovy的支持,可以提供代码提示和调试功能。 4. **定时调度**: - **Quartz**:可以使用Quartz库来定时执行Groovy脚本,它是一个强大的、开放源码...

    Java调用Groovy

    这篇博客文章“Java调用Groovy”可能会探讨如何在Java代码中执行Groovy脚本,以及这样做的优势和实践方法。 首先,Java可以通过`GroovyShell`或`GroovyScriptEngine`来执行Groovy脚本。`GroovyShell`是Groovy提供的...

    [Groovy] Making Java Groovy 英文版

    ☆ 资源说明:☆ [Manning Publications] Making ...Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing [更多]

    Java Groovy

    ### Java与Groovy:融合的力量 #### 知识点一:Java与Groovy...本书不仅详细介绍了Groovy的核心特性及其在Java项目中的应用方式,还提供了丰富的实践案例和技巧,有助于读者深入理解并掌握这两种语言之间的协同作用。

    java在嵌入运行groovy代码1

    在 Java 应用程序中运行 Groovy 脚本主要有三种方式:GroovyShell、GroovyClassLoader 和 JSR-223 规范的 ScriptEngine。 1. GroovyShell 是 Groovy 提供的一个简单实用工具,用于执行 Groovy 的脚本片段或表达式。...

    java 动态脚本语言 精通 Groovy

    Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...

    java与groovy互相调用1

    Groovy是一种基于Java平台的脚本语言,它与Java有很高的互操作性,这使得开发者可以在同一个项目中混合使用Java和Groovy,充分利用各自的优点。 首先,我们来看Java调用Groovy的情况。在示例中,我们定义了一个...

    Java整合Groovy脚本笔记

    Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合...

    从Java和JavaScript来学习Haskell和Groovy_.docx

    标题和描述提到的是从已熟悉的Java和JavaScript出发,学习Haskell和Groovy这两门不同的编程语言,特别是关注它们的动态语言特性和函数式编程特性。标签为"安全",虽然这个主题没有直接涉及安全技术,但我们可以推测...

    Groovy+Java混合使用例子

    Groovy环境搭建教程中的例子工程,纯Java、纯Groovy以及Java+Groovy混合 教程参考:http://blog.csdn.net/rcom10002/archive/2011/06/26/6568557.aspx

    Making Java Groovy源码

    Making Java Groovy Kenneth A. Kousen 1.Easier Java 2.Closures, builders, and metaprogramming 3.Gradle for builds, Spock for testing 4.Groovy frameworks like Grails and Griffon 源码

    JGSK, Java,Groovy,Scala,Kotlin 四种语言的特点对比.zip

    然而,Groovy的运行速度通常比Java慢,且由于动态类型的特性,调试和维护可能会更复杂。 Scala是由Martin Odersky设计的一种多范式语言,它结合了面向对象和函数式编程的概念。Scala的强类型系统和模式匹配功能提供...

    java_groovy_python集合

    在IT行业中,掌握多种编程语言是非常重要的,尤其是像Java、Groovy和Python这样的流行语言。这些语言各有特点,广泛应用于不同的领域。以下是对标题、描述和标签所提及的知识点的详细解析: 标题“java_groovy_...

    Making Java Groovy--Kenneth.A.Kousen

    Making Java Groovy--Kenneth.A.Kousen. Java Groovy 很不错的学习资料

    干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc

    例如在服务器上执行 shell 命令、运行 python 或者 java 测试代码以及使用 groovy 脚本来实现一些更为复杂的功能等等。 执行 shell 命令 在 Jenkins Pipeline 中,使用 `sh` 指令可以执行 shell 命令。例如,使用 ...

Global site tag (gtag.js) - Google Analytics