`
riali
  • 浏览: 41637 次
  • 性别: 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项目中的应用方式,还提供了丰富的实践案例和技巧,有助于读者深入理解并掌握这两种语言之间的协同作用。

    Spock是适合Java和Groovy应用程序的一个测试框架

    Spock 是一个强大的测试框架,尤其适用于Java和Groovy开发者,它为这两种语言的应用程序提供了高效、简洁且富有表达力的测试解决方案。Spock的核心设计理念是通过声明式的方式来编写测试,使得测试代码更加易读、...

    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和JavaScript来学习Haskell和Groovy_.docx

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

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

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

    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 源码

    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