luajit缺点_luajit和lua区别
作者:paintsnow
鏈接:https://www.zhihu.com/question/49144449/answer/123116906
來源:知乎
著作權歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權。
其實我是不主張在開發(fā)時就用LuaJIT的,因為這樣會把人養(yǎng)懶…… 因為JIT的強大性能,掩蓋了太多代碼中的低效實現(xiàn),反而最后想要提升性能已經(jīng)不可能了==
回到正題,我的建議是,如果使用luajit,就全部都使用,
即使在不支持jit的IOS平臺上,你也應該使用禁用掉jit功能的LuaJIT,而不是原版lua。
如果要將現(xiàn)有代碼遷移至LuaJIT,我建議您看一下下面的內(nèi)容。
LuaJIT和lua的兼容性是有的,而且問題非常之多,在我的DontStarveLuaJIT系列文章中有兩篇提到了多處不同:
饑荒游戲掃雷筆記(一)|腳本引擎篇——LuaJIT的救贖(合集) – paintsnow的文章 – 知乎專欄
饑荒游戲掃雷筆記(二) | 腳本引擎篇——偷懶的高溫陷阱 – paintsnow的文章 – 知乎專欄
如果不想看原文,我大概總結一下:
1. string HASH策略不一樣,導致表的遍歷順序不一樣。(你不應該讓程序邏輯依賴于表的遍歷順序)
2. 表的[0]索引的實現(xiàn)不一樣,LuaJIT會放在array part,而lua則在hash part,導致遍歷順序不一樣(使用pairs或者next)。
3. string的轉(zhuǎn)義符處理策略不一樣,對于”\abcdef”這樣的字符串,lua會把不能形成有效轉(zhuǎn)義序列的字符串拆開,也就是這里的\和a都會出現(xiàn)在最終的字符串里。而LuaJIT會報錯,因為沒有\(zhòng)a這個轉(zhuǎn)義符。
4. LuaJIT新增加了不少轉(zhuǎn)義符,像\u{1234}來表示unicode字符。
5. LuaJIT新增加了自己的庫函數(shù),例如ffi等。使用它們后將不再會保持與原版lua的兼容性。
6. LuaJIT和lua5.2及以后的版本不支持arg這個語法糖來代表{…},因此舊代碼遷移到luaJIT會有這樣的問題。
7. LuaJIT會有一些限制,比如說一個函數(shù)內(nèi)最多定義的常量個數(shù),函數(shù)最多的參數(shù)個數(shù)之類的。這些上限一般都比lua的上限要小,所以有些過于復雜的代碼能在lua中跑但是在LuaJIT中會引起編譯錯誤。有的限制可以調(diào)整luaJIT代碼中的常量來提高,但是像“函數(shù)內(nèi)最多定義的常量個數(shù)”由于指令格式的限制,想到突破需要新增指令,需要對LuaJIT比較熟悉才能做到;否則就像我文章中提到的那樣針對某些情況繞過去。(通常會發(fā)生在序列化數(shù)據(jù)表的地方)
8.
@唐藝洋 提到的,luaJIT內(nèi)存上限為4G
9. LuaJIT中使用table.unpack(table.pack(1, 2, 3, nil, 5))將得到1, 2, 3而不是1, 2, 3, nil, 5
10. 想到了再續(xù)
總結
以上是生活随笔為你收集整理的luajit缺点_luajit和lua区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用命令行加载 jMeter 自定义配置
- 下一篇: 如何使用 jMeter CSV Data