拷贝 Lua 函数的开销

我有很多命名相同的 lua 脚本,用于函数名(用于“入口点”),我想运行它们。但是我想尽可能快地完成它。

经过一些浏览/谷歌/思考,我得到了两个解决方案。

1.我有一个主 lua_State。我将所有必要的给定和自己的 lib/function 放入其中。接下来,我将当前 lua-script 的 lua_State 的函数(使用链接列表作为 chunck 容器)lua_dump(),然后我将其 lua_load() 到主 lua_State,然后 lua_call() 主 lua_State。这样我不必为所有脚本加载所有的 libs。因此,主 lua_State 是一个“环境”。:)

2.我只需为所有 lua_State 加载 libs。然后 lua_call() 它们。

问题是:第一个逻辑正确吗?如果是,你会使用哪一个?有更好的解决方案吗?

提前感谢并为我的英语道歉。

(如果第一个确实是正确的,是否有一些明显的优化可能性?)

原文链接 https://stackoverflow.com/questions/7348552

点赞
stackoverflow用户513763
stackoverflow用户513763

正如您所说,我不明白为什么您需要超过1个Lua状态。如果您只有一个Lua状态,那么您将会有的开销只是加载库(一次)和从运行的脚本中加载函数(一次,除非您需要从文件中“刷新”它们)。所以只需有一个状态,并使用dofile运行脚本。

如果您真的需要多个lua_States,您可以只加载所需的库,详见 Lua参考手册的第五章之前的段落中所述。

还可以在《Lua Gems Book》中找到一个有关优化Lua代码的好章节。

2011-09-08 13:41:29
stackoverflow用户1801919
stackoverflow用户1801919

我最近做了类似的事情,决定使用单个 lua_State。我通过使用 _ENV upvalue 将每个脚本文件都加载到自己的环境中(将每个脚本的环境生成为全局环境的一份副本)。这样名称就不会冲突,我认为如果您需要并行运行更多的脚本,这样做可能更好。

对于我的目的来说,它很有效,因为我需要随时随地随机访问所有已加载脚本的函数,但如果您只需要运行它们一次,那么可以在同一个 lua_State 中顺序加载和执行它们。

编辑:我注意到我实际上错过了问题的要点。为回答问题:如果您需要加载任何标准库,则使用单个 lua_State 会更快(开销是明显的)。如果您只运行每个脚本一次,则不需要使用 lua_dump / lua_load,只需使用 luaL_dofile,然后在入口函数上使用 lua_pcall,然后继续(即加载下一个文件)。

2012-11-09 03:34:26