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中的性能對比/
