去年的文章,備份
lua和groovy都是可以嵌入到j(luò)ava中的腳本語言,。lua以高性能著稱,,與C/C++在游戲開放中有較多使用,groovy是一個基于Java虛擬機(jī)(JVM)的敏捷動態(tài)語言,,在jvm下有著不錯的性能,。
groovy天生與java有著極高的兼容性,兩者間對象無縫存取,,支持jsr223,。而lua是基于C的,需要調(diào)用jni,,jni的性能是硬傷,。這塊網(wǎng)上基本都用luajava,好多年不更新了,,不支持jsr223,,而且很多方法都沒有實(shí)現(xiàn),也不能做到對象無縫存取,,比如lua傳到j(luò)ava的對象,,java用不了。 另一個是luaj,,基于java的lua庫,,快速,穩(wěn)定,,支持jsr223,,測試對比用的是這個,。 再提一個jnlua,文檔里寫的很牛逼,,支持jsr223,,支持雙向?qū)ο笳{(diào)用,結(jié)果根本跑不了,,shit,。
測試程序都是基于jsr223編寫,先經(jīng)過腳本編譯,。再運(yùn)行一遍腳本,。 然后統(tǒng)計(jì)調(diào)用腳本100次消耗的時間,求平均,??梢匀コ幾g腳本、初次運(yùn)行等因素帶來的干擾,。測試機(jī)器為win32機(jī)器,。
對比結(jié)果如下:
|
LuaLuaj 2.0.2 |
Groovy2.0.1 |
Jython2.5.3 |
Javajdk6 |
100000次for |
4ms |
2ms |
42ms |
1ms |
100000次整數(shù)比較 |
7ms |
9ms |
|
1ms |
外部傳入大小100000的List<Integer>,迭代相加 |
82ms |
7ms |
|
3ms |
創(chuàng)建100000大小的table,。并賦值 |
34ms |
38ms |
|
64ms |
復(fù)雜四則計(jì)算100000次 |
480ms |
280ms |
|
130ms |
100000記錄的group |
578ms |
286ms |
|
180ms |
可以看出在jvm環(huán)境中,,groovy的性能基本是lua的2倍,特別是lua調(diào)用java傳入的對象時,,性能更低,。 兩種腳本語言創(chuàng)建table的性能都比java高。 不要再迷信那些官方的性能測試,,不考慮應(yīng)用的上下文,,那些性能測試報(bào)告只能做個參考。
附100000次整數(shù)比較的測試代碼:
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(“l(fā)ua 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下結(jié)果 lua:7ms groovy:9ms mac os下結(jié)果 lua:7ms groovy:1ms
|