我有很多用于函数名称的lua-script(用于“入口点”),我想运行它们。但我希望尽可能快地完成它。
经过一番浏览/谷歌搜索/思考后,我有两个解决方案。
1.我有一个主要的lua_State。我将所有必需的和我自己的库/函数“加载”到它中。接下来我lua_dump()当前lua-script的lua_State函数(使用chunck容器的链表),然后我lua_load()它到主lua_State然后lua_call()主lua_State。使用此解决方案,我不必为所有脚本加载所有库。所以主要的lua_State是一个“环境”。 :)
2.我只是为所有lua_State执行libs加载。然后是lua_call()他们。
问题是:即使是第一个逻辑正确吗?如果是的话,你会使用哪一个?有更好的解决方案吗?
提前致谢,对不起我的英语。
(如果第一个真正正确,是否存在一些不经意的优化可能性?)
答案 0 :(得分:2)
正如你所说,我不明白为什么你想要超过1个Lua状态。如果您只有一个Lua状态,那么您将拥有所有开销(一次),然后从您运行的脚本加载函数(一次,除非您需要从文件中“刷新”它们)。所以只需要1个状态,然后dofile
脚本。
如果你真的需要那些多个lua_States,你只能加载你需要的库,如上所述 in the Lua Reference Manual, in the paragraph just above 5.1
在Lua Gems Book中还有一个关于优化Lua代码的免费章节。
答案 1 :(得分:0)
我最近做了类似的事情,决定使用一个lua_State
。我已经通过使用_ENV
upvalue将每个脚本文件自定义加载到自己的环境中(为每个脚本文件生成一个新环境作为全局环境的副本)。通过这种方式,名称不会发生冲突,我相信如果您出于某种原因需要,可以并行运行更多脚本。
它适用于我的目的,因为我需要在任何时候随机地访问所有加载脚本中的函数,但如果您只需要运行它们一次,那么您可以在相同的时间内加载和执行它们lua_State。
编辑:我注意到我实际上错过了问题的重点。回答:如果需要加载任何标准库,使用单个lua_State会更快(开销很明显)。如果您只是在不需要使用lua_dump/lua_load
时运行每个脚本,只需在输入函数上执行luaL_dofile
后跟lua_pcall
之类的操作,然后继续(即加载下一个脚本)文件)。