【发布时间】:2015-04-17 20:16:10
【问题描述】:
我知道你可以直接使用名称来获取变量和调用函数
variable.functionName
或使用名称作为字符串
variable["functionName"] or variable[functionNameString]
现在我的问题是: 这些不同的方式是否存在任何差异,或者它们是否完全可以互换?
我对这里的性能最感兴趣,但欢迎任何启发。
【问题讨论】:
我知道你可以直接使用名称来获取变量和调用函数
variable.functionName
或使用名称作为字符串
variable["functionName"] or variable[functionNameString]
现在我的问题是: 这些不同的方式是否存在任何差异,或者它们是否完全可以互换?
我对这里的性能最感兴趣,但欢迎任何启发。
【问题讨论】:
PUC-Rio Lua 5.1 字节码用于p>
print(variable.functionName)
print(variable["functionName"])
print(variable[functionNameString])
是
main <var.lua:0,0> (14 instructions, 56 bytes at 0xafe530)
0+ params, 3 slots, 0 upvalues, 0 locals, 4 constants, 0 functions
1 [1] GETGLOBAL 0 -1 ; print
2 [1] GETGLOBAL 1 -2 ; variable
3 [1] GETTABLE 1 1 -3 ; "functionName"
4 [1] CALL 0 2 1
5 [2] GETGLOBAL 0 -1 ; print
6 [2] GETGLOBAL 1 -2 ; variable
7 [2] GETTABLE 1 1 -3 ; "functionName"
8 [2] CALL 0 2 1
9 [3] GETGLOBAL 0 -1 ; print
10 [3] GETGLOBAL 1 -2 ; variable
11 [3] GETGLOBAL 2 -4 ; functionNameString
12 [3] GETTABLE 1 1 2
13 [3] CALL 0 2 1
14 [3] RETURN 0 1
如您所见,前两行生成完全相同的字节码(因此花费相同的时间),而第三行有一个额外的(全局)变量访问。
只有"functionName" 是有效的 Lua 标识符而不是保留字,所以第一行才有效。第 2 行和第 3 行对字符串键的格式没有限制。
【讨论】:
luac -l -p 输出。
它们是一样的。来自the manual:
... 为了表示记录,Lua 使用字段名作为索引。该语言通过提供
a.name作为a["name"]的语法糖来支持这种表示。
【讨论】: