优化 – 将值声明为本地值一次比每次声明本地值慢
发布时间:2020-12-14 21:47:42 所属栏目:大数据 来源:网络整理
导读:这段代码怎么可能: local tfor n = 0,255 do t = math.random(0,255) ...end 实际上比这个慢吗? for n = 0,255 do local t = math.random(0,255) ...end 由于我在…部分不止一次访问,我想知道,for循环有自己的局部变量集吗?如果是,从当前块访问本地变量比
这段代码怎么可能:
local t for n = 0,255 do t = math.random(0,255) ... end 实际上比这个慢吗? for n = 0,255 do local t = math.random(0,255) ... end 由于我在…部分不止一次访问,我想知道,for循环有自己的局部变量集吗?如果是,从当前块访问本地变量比从外部块访问本地变量更快? 解决方法
通常,将变量声明为尽可能本地.是的,for循环有自己的范围.这是更好的编码风格,正如这个例子所示,通常更优化.
让我们看看两个代码生成的指令,使用luac -l 第一件作品: main <t.lua:0,0> (13 instructions at 00000000005e8260) 0+ params,8 slots,1 upvalue,5 locals,5 constants,0 functions 1 [1] LOADNIL 0 0 2 [2] LOADK 1 -1 ; 0 3 [2] LOADK 2 -2 ; 255 4 [2] LOADK 3 -3 ; 1 5 [2] FORPREP 1 6 ; to 12 6 [3] GETTABUP 5 0 -4 ; _ENV "math" 7 [3] GETTABLE 5 5 -5 ; "random" 8 [3] LOADK 6 -1 ; 0 9 [3] LOADK 7 -2 ; 255 10 [3] CALL 5 3 2 11 [3] MOVE 0 5 12 [2] FORLOOP 1 -7 ; to 6 13 [4] RETURN 0 1 第二部分: main <t.lua:0,0> (11 instructions at 0000000000538260) 0+ params,7 slots,0 functions 1 [1] LOADK 0 -1 ; 0 2 [1] LOADK 1 -2 ; 255 3 [1] LOADK 2 -3 ; 1 4 [1] FORPREP 0 5 ; to 10 5 [2] GETTABUP 4 0 -4 ; _ENV "math" 6 [2] GETTABLE 4 4 -5 ; "random" 7 [2] LOADK 5 -1 ; 0 8 [2] LOADK 6 -2 ; 255 9 [2] CALL 4 3 2 10 [1] FORLOOP 0 -6 ; to 5 11 [3] RETURN 0 1 如你看到的.第一部分有两条额外的说明.其中一个是在循环内: 11 [3] MOVE 0 5 这样做是为了将寄存器5中的结果(具有math.random的结果)移动到寄存器0(变量t所在的位置).这就回答了你的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |