在写一些one-off Lua code作为答案时,我发现自己编码打高尔夫球以适应单行的功能。虽然这段代码不适合一行......
foo=function(a,b) local c=bob; some_code_using_c; return c; end
......我意识到我可以通过将其转换为:
来使其合适foo=function(a,b,c) c=bob; some_code_using_c; return c; end
使用函数参数声明函数局部变量(假设我知道第三个参数永远不会传递给函数)而不是使用local
是否有任何性能或功能影响?这两种技术的表现是否有所不同?
注意:为了清晰起见,我在上面添加了分号,并帮助那些不了解Lua处理空白的人。我知道他们没有必要;如果您按照上面的链接,您将看到实际代码不使用它们。
编辑根据@ Oka的回答,我将这两个函数生成的字节码与单独的文件进行了比较:
function foo(a,b)
local c
return function() c=a+b+c end
end
function foo(a,b,c)
-- this line intentionally blank
return function() c=a+b+c end
end
忽略地址,字节代码报告是相同的(除了为函数列出的参数数量)。
答案 0 :(得分:2)
您可以继续查看使用luac -l -l -p my_file.lua
生成的Lua字节码,比较指令集和寄存器布局。
在我的机器上:
function foo (a, b)
local c = a * b
return c + 2
end
function bar (a, b, c)
c = a * b
return c + 2
end
产地:
function <f.lua:1,4> (4 instructions at 0x80048fe0)
2 params, 4 slots, 0 upvalues, 3 locals, 1 constant, 0 functions
1 [2] MUL 2 0 1
2 [3] ADD 3 2 -1 ; - 2
3 [3] RETURN 3 2
4 [4] RETURN 0 1
constants (1) for 0x80048fe0:
1 2
locals (3) for 0x80048fe0:
0 a 1 5
1 b 1 5
2 c 2 5
upvalues (0) for 0x80048fe0:
function <f.lua:6,9> (4 instructions at 0x800492b8)
3 params, 4 slots, 0 upvalues, 3 locals, 1 constant, 0 functions
1 [7] MUL 2 0 1
2 [8] ADD 3 2 -1 ; - 2
3 [8] RETURN 3 2
4 [9] RETURN 0 1
constants (1) for 0x800492b8:
1 2
locals (3) for 0x800492b8:
0 a 1 5
1 b 1 5
2 c 1 5
upvalues (0) for 0x800492b8:
没有太大区别,有吗?如果我没有弄错的话,那么为每个c
指定一个稍微不同的声明位置,以及params大小的差异,正如人们所期望的那样。