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 ...
随机推荐
- hdu3622(二分+two-sat)
传送门:Bomb Game 题意:给n对炸弹可以放置的位置(每个位置为一个二维平面上的点),每次放置炸弹是时只能选择这一对中的其中一个点,每个炸弹爆炸的范围半径都一样,控制爆炸的半径使得所有的爆炸范围 ...
- 【Linux编程】存储映射I/O
存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射,对缓冲区的读.写操作就是对文件的读.写操作,从而能够不再使用read.write系统调用. 将文件映射到存储区的函数由mmap完毕,函数原型 ...
- hdu4126(最小生成树+dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4126 题意:给出一幅3000个点的图,有10000次操作: 求将某条边的权值变大后的最小生成树,最后输 ...
- 《Node.js In Action》笔记之流程控制
转向Javascript后,开始学习了node.js,选择的第一本书是<Node.js in Action> 将近一个月时间,断断续续看完,选几个点做下笔记 1.实现串行化流程控制 var ...
- SpringMVC @ResponseBody 415错误处理
在查看下面部分内容之前,请先检查你的请求蚕食是否正确,如果全部正确,请继续往下看 刚开始用SpringMVC, 页面要使用jQuery的ajax请求Controller. 但总是失败,主要表现为以下两 ...
- Linux下将UTF8编码批量转换成GB2312编码的方法
Linux下将UTF8编码批量转换成GB2312编码的方法 在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换成GB2312编码,下面为大家介绍下在Linux ...
- 打开或导入项目,从脱机 Outlook 数据文件 (.ost)
打开或导入项目,从脱机 Outlook 数据文件 (.ost) Microsoft Outlook 2010 doesn\rquote t 支持手动打开或导入项目,从一个 脱机 Outlook 数据文 ...
- centos下ant的安装
1.创建一个文件夹,用于安装ant.我们这里临时在/usr文件夹下创建ant文件夹. 2.下载 cd /usr/ant进入该文件夹,使用wget ant的下载地址 下载ant到当前文件夹下.附an ...
- 学习OpenCV第0天
自2011年接触OpenCV已经有几年了,一直停留在写一些小程序,利用手冊完毕一些任务,一直没有深入研究当中代码,现在毕业,但各种原因未能进入图像处理行业,故现重学OpenCV,包含分析代码,学习算法 ...
- SessionFactory的创建和Session的获得
1.当我们调用 Configuration config=new Configuration().configure(); 时候Hibernate会自己主动在当前的CLASSPATH中搜寻hibern ...