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()
。