Vir*_*721 5 c performance lua reset
我有一个运行Lua脚本的应用程序.每个Lua脚本可能会运行几次.每次按下某个键时,某些脚本甚至可能会运行.
我希望这些脚本在每次运行之间"重置".即如果用户设置变量Foo,则下次运行时脚本中不应存在Foo,直到用户再次定义它为止.
问题是,如果我想要这样的行为,我需要每次都创建一个新的lua_State,然后每次都打开它,然后每次解析脚本文件,这似乎是非常不优化的.
加载库可能是一个相当轻量级的操作(我假设),但解析脚本可能不是.
有没有办法重置Lua脚本的状态(即清除用户代码定义的变量)而不创建新的lua_State并重新整理整个Lua脚本文件?我只想在应用程序启动时解析一次脚本文件,因为它们在运行时没有修改过.
谢谢.:)
编辑:我发现了这个主题,但没有详细说明:http://lua-users.org/lists/lua-l/2006-01/msg00493.html
编辑:lua_setfenv似乎与此有关.我会再挖一点.
编辑:从LUA 5.2开始,似乎没有更多的lua_setfenv.由于我使用的是5.3,我必须设置环境(即隐藏的表nammed _ENV,其中存储了变量)以便这样做,从而重新加载所有内容,这是我不想做的...
不幸的是,上次我调查这个问题时,答案是否定的。
您还需要记住,Lua 可能会调用库,可能会打开文件、malloc()内存等,并且任何“重置”都需要处理关闭这些文件、释放内存等。
作为“重置”Lua 状态的替代方法,您可以简单地组织代码,使其不需要重置;这显然需要以特定的方式编写Lua代码。一种方法是坚持您的 Lua 代码完全(或几乎完全)包含在函数中,并为每个操作调用一个或多个函数。函数外部的代码可能(例如)返回一个 Lua 表,其中包含调用特定入口点的引用;这只会被调用一次。函数在调用时会自行清除,包括清除任何库分配的项目、打开的文件等。应避免全局变量(除非常量)。我们成功地使用这种方法来确保 Lua 只解析一次,入口点确定一次,但相对较小的函数可以非常快速地调用,而且开销很小。
在评论中,您建议您可以按词法将 Lua 代码包装在函数块中。我认为这种方式不如上面的方式灵活,并且有以下缺点:
您失去了执行“一次性初始化”的机会(例如从磁盘读取固定常量)
如果用户end ... function B()在代码中插入(例如)不匹配的内容,您将面临不可预测的风险
您将自己限制为每个 Lua 状态只有一个入口点。
这确实意味着 Lua 代码必须以不同的方式编写(本质上 Lua 编码器以所需的形式提供代码)。解决此问题的一种可能方法是使用固定框架来执行此操作,并require在代码中作为库进行调用。我没有尝试过这种方法。
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |