亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
首頁 > Java > java教程 > 正文

Java代碼中與Lua相互調(diào)用怎么實現(xiàn)

PHPz
發(fā)布: 2023-05-17 15:43:15
轉(zhuǎn)載
1847人瀏覽過

    一、方案

    java與lua相互調(diào)用案例比較少,因此項目使用需要做詳細(xì)的性能測試,本內(nèi)容只做粗略測試。

    目前已完成初版Lua-Java調(diào)用框架開發(fā),后期有時間準(zhǔn)備把框架進(jìn)行抽象,并開源出來,感興趣的小伙伴歡迎關(guān)注下。

    目前最常見的方案:luaj,純Java實現(xiàn)的Lua解析器,基于Lua 5.2

    LuaJ的原理:用Java實現(xiàn)了一套Lua的編譯器,本質(zhì)上是把Lua文件中的Lua語言動態(tài)編譯成了Java字節(jié)碼,因此會收到諸多限制(比如第三方庫的問題),而LuaJ本質(zhì)上也只是運行在JVM上的Java字節(jié)碼,和運行在C編譯器環(huán)境下的Lua是有區(qū)別的

    Maven pom

    雖然源碼已有3.0.2版本,但作者未上傳maven,如有需要,可以自行導(dǎo)入jar包(源碼中已打好3.0.2的jar包)

    立即學(xué)習(xí)Java免費學(xué)習(xí)筆記(深入)”;

    <dependency>
        <groupId>org.luaj</groupId>
        <artifactId>luaj-jse</artifactId>
        <version>3.0.1</version>
    </dependency>
    登錄后復(fù)制

    二、性能測試

    以下我們以最基本的for循環(huán)并執(zhí)行加法操作為例,分別在java外部for一萬次,并在lua內(nèi)部再for一萬次

    java原生代碼

    原生代碼執(zhí)行時間:1ms ~ 2ms

    private static void runJava(int iterNum) {
        beg = System.currentTimeMillis();
        for (int j = 0; j < iterNum; j++) {
            int a = 0;
            for (int i = 0; i < 10000; i++) {
                a = a + i;
            }
        }
        end = System.currentTimeMillis();
    }
    登錄后復(fù)制

    lua腳本

    function test()
        a = 0;
        for i = 0, 10000, 1 do
            a = a + i;
        end
    end
    登錄后復(fù)制

    1. ScriptEngine調(diào)用方式

    調(diào)用方式:外部10000次調(diào)用,lua內(nèi)部10000次循環(huán)a++ 總時間:8.9s左右 平均一次lua方法調(diào)用(1w次a++):0.89ms lua內(nèi)部一次循環(huán)調(diào)用(1次a++):0.000089ms 修改lua內(nèi)部循環(huán)1次 時間:10ms 平均一次lua方法調(diào)用:0.001ms

    // ==================================================================================
    // ScriptEngine方式
    // ==================================================================================
    Reader reader = new FileReader(luaStr);
    LuaScriptEngine luaScriptEngine = (LuaScriptEngine) new LuaScriptEngineFactory().getScriptEngine();
    // 使用luajc編譯器,比默認(rèn)luac編譯器快3倍
    LuajContext context = (LuajContext) luaScriptEngine.getContext();
    LuaJC.install(context.globals);
    CompiledScript compiledScript = luaScriptEngine.compile(reader);
    Bindings bindings = new SimpleBindings();
    compiledScript.eval(bindings);
    LuaFunction luafunc = (LuaFunction) bindings.get("test");
    beg = System.currentTimeMillis();
    for (int i = 0; i < iterNum; i++) {
        luafunc.call();
    }
    end = System.currentTimeMillis();
    // ==================================================================================
    登錄后復(fù)制

    2. Globals調(diào)用方式

    調(diào)用方式:外部10000次調(diào)用,lua內(nèi)部10000次循環(huán)a++ 時間:2.3s左右 平均一次lua方法調(diào)用:0.23ms lua內(nèi)部一次循環(huán)調(diào)用:0.000023ms 修改lua內(nèi)部循環(huán)1次 時間:4ms 平均一次lua方法調(diào)用:0.0004ms

    // ==================================================================================
    // Global方式
    // ==================================================================================
    Globals globals = JsePlatform.standardGlobals();
    // 使用luajc編譯器,比默認(rèn)luac編譯器快3倍
    LuaJC.install(globals);
    LuaValue doFile = globals.get("dofile");
    doFile.call(LuaValue.valueOf(luaStr));
    LuaValue luaValue = globals.get("test");
    beg = System.currentTimeMillis();
    for (int i = 0; i < iterNum; i++) {
        luaValue.call();
    }
    end = System.currentTimeMillis();
    登錄后復(fù)制
    ? 1w*1w調(diào)用總時間 平均一次lua腳本時間 lua內(nèi)部一次循環(huán)時間
    Java 1ms-2ms - -
    ScriptEngine 8.9s 0.89ms 0.000089ms
    Globals 2.3s 0.23ms 0.000023ms

    3. lua調(diào)用java

    把lua內(nèi)的循環(huán)10000次,挪到j(luò)ava方法執(zhí)行,java for(10000) -> lua -> java for(10000)

    代碼小浣熊
    代碼小浣熊

    代碼小浣熊是基于商湯大語言模型的軟件智能研發(fā)助手,覆蓋軟件需求分析、架構(gòu)設(shè)計、代碼編寫、軟件測試等環(huán)節(jié)

    代碼小浣熊51
    查看詳情 代碼小浣熊
    function test()
        luaTestJava:javaLoop()
    end
    登錄后復(fù)制

    Java提供loop方法

    public static void javaLoop() {
        int a = 0;
        for (int i = 0; i < 10000; i++) {
            a = a + i;
        }
    }
    登錄后復(fù)制

    Global調(diào)用方式:5ms ScriptEngine調(diào)用方式:30ms

    三、結(jié)論

    • luaj沒有jit

    • 目前看來,在luaJ這個方案下,Globals的調(diào)用方式速度最快

    • 同樣的代碼,在lua執(zhí)行和在java執(zhí)行始終是有差距的,lua執(zhí)行就是比java執(zhí)行慢很多 后經(jīng)過分析源碼,發(fā)現(xiàn)luaj的每一次++操作,都會new出LuaValue對象,經(jīng)過dump也發(fā)現(xiàn)測試中的LuaValue對象創(chuàng)建非常多

    • luaJ的實現(xiàn)相對完整,lua和java可以相互調(diào)用,相互傳參

    某些情況下,luajc編譯模式的效率和基于C的lua效率差不多源碼中的示例

    Java代碼中與Lua相互調(diào)用怎么實現(xiàn)

    四、其他調(diào)用方式?

    脫離java環(huán)境的lua編譯器,lua單獨運行進(jìn)程,提供服務(wù),java跨進(jìn)程調(diào)用服務(wù)(沒有嘗試過,不知道跨進(jìn)程調(diào)用掉率如何,也不知道lua進(jìn)程資源占用情況) 這樣lua可以使用luajit,也不受版本限制(luaJ是5.2)

    以上就是Java代碼中與Lua相互調(diào)用怎么實現(xiàn)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

    相關(guān)標(biāo)簽:
    java速學(xué)教程(入門到精通)
    java速學(xué)教程(入門到精通)

    java怎么學(xué)習(xí)?java怎么入門?java在哪學(xué)?java怎么學(xué)才快?不用擔(dān)心,這里為大家提供了java速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

    下載
    來源:億速云網(wǎng)
    本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
    最新問題
    開源免費商場系統(tǒng)廣告
    最新下載
    更多>
    網(wǎng)站特效
    網(wǎng)站源碼
    網(wǎng)站素材
    前端模板
    關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
    php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
    關(guān)注服務(wù)號 技術(shù)交流群
    PHP中文網(wǎng)訂閱號
    每天精選資源文章推送
    PHP中文網(wǎng)APP
    隨時隨地碎片化學(xué)習(xí)
    PHP中文網(wǎng)抖音號
    發(fā)現(xiàn)有趣的

    Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號