Lua variable.functionName和variable[“functionName”之间的差异

Lua variable.functionName和variable[“functionName”之间的差异,lua,lua-table,Lua,Lua Table,我知道你可以通过直接使用这个名字来获取变量和调用函数 variable.functionName 或者使用名称作为字符串 variable["functionName"] or variable[functionNameString] 现在我的问题是: 在这些不同的方式中是否存在任何差异,或者它们是否完全可以互换 我对这里的性能非常感兴趣,但欢迎您提供任何启示。PUC Rio Lua 5.1字节代码 print(variable.functionName) print(variable["f

我知道你可以通过直接使用这个名字来获取变量和调用函数

variable.functionName
或者使用名称作为字符串

variable["functionName"] or variable[functionNameString]
现在我的问题是: 在这些不同的方式中是否存在任何差异,或者它们是否完全可以互换


我对这里的性能非常感兴趣,但欢迎您提供任何启示。

PUC Rio Lua 5.1字节代码

print(variable.functionName)
print(variable["functionName"])
print(variable[functionNameString])

main(14条指令,0xafe530处56字节)
0+参数,3个插槽,0个上限值,0个局部变量,4个常量,0个函数
1[1]获取全局0-1;打印
2[1]GETGLOBAL 1-2;变量
3[1]可获取的11-3;“函数名”
4[1]呼叫0 2 1
5[2]获取全局0-1;打印
6[2]GETGLOBAL 1-2;变量
7[2]可得性11-3;“函数名”
8[2]呼叫0 2 1
9[3]GETGLOBAL 0-1;打印
10[3]GETGLOBAL 1-2;变量
11[3]GETGLOBAL 2-4;函数名称字符串
12[3]可获取1 2
13[3]呼叫0 2 1
14[3]返回0 1
如您所见,前两行生成完全相同的字节码(因此需要相同的时间),而第三行具有额外的(全局)变量访问权限

第一行仅起作用,因为
“functionName”
是有效的Lua标识符,而不是保留字。第2行和第3行对字符串键的格式没有限制。

它们是相同的。发件人:

。。。为了表示记录,Lua使用字段名作为索引。该语言通过提供
a.name
作为
a[“name”]
的语法糖来支持这种表示


该列表由
luac-l-p
输出。
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