【问题标题】:Overhead of copying lua functions复制 lua 函数的开销
【发布时间】:2011-11-12 23:53:43
【问题描述】:

我有很多与函数名称(用于“入口点”)同名的 lua 脚本,我想运行它们。但我想让它尽可能快。

经过一些浏览/谷歌搜索/思考后,我有两个解决方案。

1.,我有一个主要的 lua_State。我将所有必要的给定和我自己的库/函数“加载”到其中。接下来我 lua_dump() 当前 lua-script 的 lua_State 的函数(使用链表作为块容器),然后我 lua_load() 它到主 lua_State,然后 lua_call() 到主 lua_State。使用此解决方案,我不必为所有脚本加载所有库。所以主要的 lua_State 是一个“环境”。 :)

2.,我只是为所有 lua_State 加载库。然后 lua_call() 他们。

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

先谢谢了,对不起我的英语。

(如果第一个确实正确,是否存在一些不经意的优化可能性?)

【问题讨论】:

    标签: c lua


    【解决方案1】:

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

    如果你真的需要那些多个 lua_States,你可以只加载你需要的库,如解释 in the Lua Reference Manual, in the paragraph just above 5.1

    Lua Gems Book 中还有一个很好的关于 Lua 代码优化的免费章节。

    【讨论】:

      【解决方案2】:

      我最近做了类似的事情并决定使用单个lua_State。我已经通过使用_ENV upvalue 将每个脚本文件自定义加载到它自己的环境中(为每个脚本文件生成一个新环境作为全局环境的副本)。这样名称就不会冲突,我相信如果您出于任何原因需要,您可以并行运行更多脚本。

      它适用于我的目的,因为我基本上需要在任何时候随机访问所有加载的脚本中的函数,但如果您只需要运行一次它们,那么您可以按顺序加载并执行它们lua_State.

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

      【讨论】:

        猜你喜欢
        • 2012-07-04
        • 2012-12-12
        • 2020-05-04
        • 2016-11-07
        • 2010-11-25
        • 1970-01-01
        • 2011-12-06
        • 2021-08-13
        • 2011-11-09
        相关资源
        最近更新 更多