拷贝 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
我最近做了类似的事情,决定使用单个 lua_State
。我通过使用 _ENV
upvalue 将每个脚本文件都加载到自己的环境中(将每个脚本的环境生成为全局环境的一份副本)。这样名称就不会冲突,我认为如果您需要并行运行更多的脚本,这样做可能更好。
对于我的目的来说,它很有效,因为我需要随时随地随机访问所有已加载脚本的函数,但如果您只需要运行它们一次,那么可以在同一个 lua_State
中顺序加载和执行它们。
编辑:我注意到我实际上错过了问题的要点。为回答问题:如果您需要加载任何标准库,则使用单个 lua_State
会更快(开销是明显的)。如果您只运行每个脚本一次,则不需要使用 lua_dump / lua_load
,只需使用 luaL_dofile
,然后在入口函数上使用 lua_pcall
,然后继续(即加载下一个文件)。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
正如您所说,我不明白为什么您需要超过1个Lua状态。如果您只有一个Lua状态,那么您将会有的开销只是加载库(一次)和从运行的脚本中加载函数(一次,除非您需要从文件中“刷新”它们)。所以只需有一个状态,并使用
dofile
运行脚本。如果您真的需要多个
lua_States
,您可以只加载所需的库,详见 Lua参考手册的第五章之前的段落中所述。还可以在《Lua Gems Book》中找到一个有关优化Lua代码的好章节。