Function 将一个函数放入lua中的另一个函数中是否会提高lua的性能?

Function 将一个函数放入lua中的另一个函数中是否会提高lua的性能?,function,lua,Function,Lua,如果我将一个函数放在另一个函数中,在我们添加到函数中的函数中调用它,如以下示例所示: local函数readInputFromUser() 局部剂量() 打印(“给我一个号码”) 返回io.read(“n”) 结束 num1=doSum() num2=doSum() 打印(“num1..”和“.num2..”之和等于“num1+num2”) 结束 与调用以下示例中启动的函数相比,它是否会提高程序的性能: localdosum() 打印(“给我一个号码”) 返回io.read(“n”) 结束 本

如果我将一个函数放在另一个函数中,在我们添加到函数中的函数中调用它,如以下示例所示:

local函数readInputFromUser()
局部剂量()
打印(“给我一个号码”)
返回io.read(“n”)
结束
num1=doSum()
num2=doSum()
打印(“num1..”和“.num2..”之和等于“num1+num2”)
结束
与调用以下示例中启动的函数相比,它是否会提高程序的性能:

localdosum()
打印(“给我一个号码”)
返回io.read(“n”)
结束
本地函数readInputFromUser()
num1=doSum()
num2=doSum()
打印(“num1..”和“.num2..”之和为“num1+num2”)
结束

在第二个示例中,将doSum()函数作为性能的全局函数放置是否也有好处?

当您将一个函数放置在另一个函数中时,编译后的代码不会创建它一次,每次都重复使用它

看看第一个代码的LuaJIT字节码:

这是
doSum
函数的字节码:

0001    GGET     0   0      ; "print"
0002    KSTR     1   1      ; "Give me a number"
0003    CALL     0   1   2
0004    GGET     0   2      ; "io"
0005    TGETS    0   0   3  ; "read"
0006    KSTR     1   4      ; "n"
0007    CALLT    0   2
0001    FNEW     0   0
0002    MOV      1   0
0003    CALL     1   2   1
...
...
...
这是
readInputFromUser
函数的开始:

0001    GGET     0   0      ; "print"
0002    KSTR     1   1      ; "Give me a number"
0003    CALL     0   1   2
0004    GGET     0   2      ; "io"
0005    TGETS    0   0   3  ; "read"
0006    KSTR     1   4      ; "n"
0007    CALLT    0   2
0001    FNEW     0   0
0002    MOV      1   0
0003    CALL     1   2   1
...
...
...
请看第一个说明:

0001 FNEW 0 0

FNEW
意味着
从原型D创建新的闭包,并将其存储在

每次运行
readInputFromUser
(闭包是函数内部的函数)时,此指令将创建一个新闭包。 闭包的创建包含几个过程。 它为新函数分配空间、添加到GC列表、添加upvalues、局部变量和更多内容

这会占用CPU时间,也会中断JIT编译。(在普通Lua中,闭包的CPU时间更大)

您的函数
doSum
不使用
readInputFromUser
中的任何值,因此您可以做的是在
doSum
外部
readInputFromUser
中创建
doSum
并将其用作upvalue(upvalue是函数外部(及以上)的局部变量)。 Upvalues的成本比局部值高,但闭包创建的成本远高于upvalue,所以这里可以使用upvalue。 您可以通过将
doSum
设置为全局来避免这种上升值,但是全局的成本稍高一些(
locals>upvalues>globals>closures

Sum:创建闭包的成本很高,如果您的函数不使用upvalues,您可以在外部创建一次并重新使用

顺便说一句,您在最后的
print
doSum
定义中有语法错误。 此外,这是第一个代码和第二个代码之间的近似基准测试:

doSum inside readInputFromUser: 0.29265 (Min: 0.27215, Max: 0.35823, Average: 0.29573) second(s) (81816.93%) (818 times slower)
doSum as upvalue: 0.00036 (Min: 0.0003, Max: 0.00108, Average: 0.00042) second(s) (100%)

第二个变量更快。@EgorSkriptunoff如果我将函数分成两部分作为全局变量会更快吗?不,局部变量比全局变量快。该代码不是有效的Lua代码。编写
本地函数doSum()