lua、groovy嵌入到java中的性能对比(转)
lua和groovy都是可以嵌入到java中的脚本语言。lua以高性能著称,与C/C++在游戏开放中有较多使用,groovy是一个基于Java虚拟机(JVM)的敏捷动态语言,在jvm下有着不错的性能。
groovy天生与java有着极高的兼容性,两者间对象无缝存取,支持jsr223。而lua是基于C的,需要调用jni,jni的性能是硬伤。这块网上基本都用luajava,好多年不更新了,不支持jsr223,而且很多方法都没有实现,也不能做到对象无缝存取,比如lua传到java的对象,java用不了。 另一个是luaj,基于java的lua库,快速,稳定,支持jsr223,测试对比用的是这个。 再提一个jnlua,文档里写的很牛逼,支持jsr223,支持双向对象调用,结果根本跑不了,shit。
测试程序都是基于jsr223编写,先经过脚本编译。再运行一遍脚本。 然后统计调用脚本100次消耗的时间,求平均。可以去除编译脚本、初次运行等因素带来的干扰。测试机器为win32机器。
对比结果如下:
| LuaLuaj 2.0.2 | Groovy2.0.1 | Jython2.5.3 | Javajdk6 | |
| 100000次for | 4ms | 2ms | 42ms | 1ms |
| 100000次整数比较 | 7ms | 9ms | 1ms | |
| 外部传入大小100000的List<Integer>,迭代相加 | 82ms | 7ms | 3ms | |
| 创建100000大小的table。并赋值 | 34ms | 38ms | 64ms | |
| 复杂四则计算100000次 | 480ms | 280ms | 130ms | |
| 100000记录的group | 578ms | 286ms | 180ms |
可以看出在jvm环境中,groovy的性能基本是lua的2倍,特别是lua调用java传入的对象时,性能更低。 两种脚本语言创建table的性能都比java高。 不要再迷信那些官方的性能测试,不考虑应用的上下文,那些性能测试报告只能做个参考。
附100000次整数比较的测试代码:
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class IntEquals {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine e = sem.getEngineByExtension(“.lua”);
CompiledScript cs = ((Compilable) e)
.compile(“for i=1,100000 do if i == 100 then end end return 10″);
Bindings luab = e.createBindings();
cs.eval(luab);
long start = System.nanoTime();
for (int i = 0; i < 100; i++) {
cs.eval(luab);
}
System.out.println(“lua script for 100000 time:”
+ (System.nanoTime() – start) / 100000000 + “ms”);
// groovy
e = sem.getEngineByExtension(“groovy”);
cs = ((Compilable) e)
.compile(“for ( i in 1..100000 ) { if(i==100){};}; return 10″);
cs.eval(luab);
start = System.nanoTime();
for (int i = 0; i < 100; i++) {
cs.eval(luab);
}
System.out.println(“groovy script for 100000 time:”
+ (System.nanoTime() – start) / 100000000 + “ms”);
}
}
win下结果 lua:7ms groovy:9ms
mac os下结果 lua:7ms groovy:1ms
http://www.tuicool.com/articles/QbMRFr
http://www.yiihsia.com/2012/09/lua、groovy嵌入到java中的性能对比/
lua、groovy嵌入到java中的性能对比(转)的更多相关文章
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)
2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比[续]
2017年的golang.python.php.c++.c.java.Nodejs性能对比[续] 最近忙,这个话题放了几天,今天来个续集. 上篇传送门: 2017年的golang.python.p ...
- [java]序列化框架性能对比(kryo、hessian、java、protostuff)
序列化框架性能对比(kryo.hessian.java.protostuff) 简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...
- Java中json工具对比分析
Java中几个json工具分析 1, 环境 JDK1.6+IDE(IntelliJ IDEA)+windowsXP+GBK编码 2,分析对象 jackson1.8.2 http://jackson.c ...
- java io读取性能对比
背景 从最早bio的只支持阻塞的bio(同步阻塞) 到默认阻塞支持非阻塞nio(同步非阻塞+同步阻塞)(此时加入mmap类) 再到aio(异步非阻塞) 虽然这些api改变了调用模式,但真正执行效率上是 ...
- log4j 和 log4j2 在springboot中的性能对比
文章链接: https://pengcheng.site/2019/11/17/log4j-he-log4j2-zai-springboot-zhong-de-xing-neng-dui-bi/ 前言 ...
- java数据库连接池性能对比
这个测试的目的是验证当前常用数据库连接池的性能. testcase Connection conn = dataSource.getConnection(); PreparedStatement st ...
- c++中继承和java中继承的对比
java中: class Parent{ public void test(int a){ System.out.println("Parent:" + a); System.ou ...
- c++性能之对象与指针性能比较、以及java与c++性能对比实测
为了更加直观的比较,好吧,我们选择以对象的初始化并add到list为例子. 首先,定义object如下: #include <string> #pragma once using name ...
随机推荐
- poj3207(two-sat)
传送门:Ikki's Story IV - Panda's Trick 题意:给定一个圆,圆上一些点.两点一线.现给出一些线,这些线可以在圆内连起来,也可以在圆外.问有没有可能所有的线画完且不出现相交 ...
- hdu3732(多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 题意:Ahui学习英语单词,每个单词都是不同的,并且都有自身的价值量 w 和难度值 c (0&l ...
- inkscape - 百度百科
http://wapbaike.baidu.com/view/1267893.htm?ssid=0&from=844b&uid=3151E6C0905477A13653132D762B ...
- Android -> 怎样避免Handler引起内存泄露
很多其它内容,可訪问个人博客www.liangfeizc.com 错误代码 假设在Activiy中通过内部类(Runnable)的方式定义了一个变量runnable, final Runnable r ...
- Android数据库hibernate框架
说明 /** * YDL_Hibernate总结 <br/> * (一)支持功能: 1.自己主动建表,支持属性来自继承类:可依据注解自己主动完毕建表,而且对于继承类中的注解字段也支持自己主 ...
- sharpSVN说明文档
http://sharpsvn.open.collab.net/docs/walkthrough.htm
- SVN 的revert操作
- java基金会成立Set
1.设置 当向集合Set中添加对象时.首先集合计算要添加对象的hashcode,依据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set觉得该对象在集合中不存在,直接添加进 ...
- android com.handmark.pulltorefresh 使用技巧
近期使用android com.handmark.pulltorefresh 遇到一些小问题.如今总结一些: 集体使用教程见: http://blog.csdn.net/harvic880925/ar ...
- 你不知道的Eclipse的用法:使用MAT分析Android的内存
如果使用DDMS确实发现了我们程序中存在内存泄露,那如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾分析代码逻辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一个极好的 ...