【发布时间】:2018-11-11 08:31:54
【问题描述】:
我是 Lua 的新手,正在研究如何在 C++ 程序中嵌入/使用它。我有基本的机制工作,但对尽可能快地执行代码感兴趣。所以我正在加载/编译稍后可以使用的 lua 代码(包含多个函数)。
现在假设我想从 C++ 调用一个名为“add”的 lua 函数。据我所知,我必须使用 lua_getglobal() 函数,该函数似乎可以找到并将“添加”的字节码推送到 Lua 堆栈。我可以消除查找部分,即我可以保留对函数“add”的字节码的引用,以便在需要使用它时可以简单地将其推送到堆栈中吗?我不知道当有数千个 lua 函数时 lua_getglobal() 的效率如何,我也不喜欢过早优化,但我正在尝试构建一个硬实时系统(是的,实际的物理截止日期,不仅仅是快)如果我不得不匆忙调用数十万次'add',每次都必须寻找函数似乎真的很浪费。
另外,为了好奇,实际的字节码是被推送(即复制)到堆栈上还是只是对其的引用?我希望是后者。
提前致谢
【问题讨论】:
-
"我不知道 lua_getglobal() 在有数千个 lua 函数的情况下有多高效,我也不喜欢过早优化" 过早优化是任何优化在知道要优化的原始操作或整个程序的性能的情况下。所以你似乎在自相矛盾。
-
另外,如果您正在构建“硬实时系统”,那么您应该远离任何具有垃圾收集功能的语言。就像,你知道的,Lua。
-
感谢您的回复。回复:过早优化。是的,我知道它是什么。但同样情况下,任何有经验的人都知道合法的阻塞点,例如可以执行数百万次的嵌套“for”循环的内部。不打算立即摆脱“查找”部分,但知道是否可以消除它很有用。
-
回复:GC,是的,我知道 GC 问题。那里有一些确定性的 GC,但我对 Lua 的了解还不够,无法知道它是否足够好。几天前我才开始研究嵌入式脚本语言,还有其他几种语言要检查,比如我还没有研究过的 ChaiScript。
-
"不打算立即摆脱“查找”部分,但知道是否可以消除它很有用。" 你不明白的是每次您在 Lua 脚本 中执行
add(...)时,Lua 解释器都会执行与您的 C 代码完全相同的工作(除非add是局部变量)。因此,除非您调用的唯一 Lua 函数是不执行任何操作的函数,否则在 C 中获取函数的性能是无关紧要的。这是过早优化错误的另一个原因:您找错地方了。所以无论你使用什么lua_ref噱头都无济于事。
标签: lua evaluation