variable.functionName 和变量 ["functionName"] 的区别
Difference between variable.functionName and variable["functionName"]
我知道你可以直接使用名称获取变量和调用函数
variable.functionName
或将名称用作字符串
variable["functionName"] or variable[functionNameString]
现在我的问题是:
这些不同的方式是否会产生任何差异,或者它们是否完全可以互换?
我对这里的性能最感兴趣,但欢迎任何启发。
PUC-Rio Lua 5.1 字节码为
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行对字符串键的格式没有限制。
他们是一样的。来自 the manual:
... To represent records, Lua uses the field name as an index. The language supports this representation by providing a.name
as syntactic sugar for a["name"]
.
我知道你可以直接使用名称获取变量和调用函数
variable.functionName
或将名称用作字符串
variable["functionName"] or variable[functionNameString]
现在我的问题是: 这些不同的方式是否会产生任何差异,或者它们是否完全可以互换?
我对这里的性能最感兴趣,但欢迎任何启发。
PUC-Rio Lua 5.1 字节码为
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行对字符串键的格式没有限制。
他们是一样的。来自 the manual:
... To represent records, Lua uses the field name as an index. The language supports this representation by providing
a.name
as syntactic sugar fora["name"]
.