2017-05-10 10 views
1

名前空間のように使用されるテーブルは、実行する前にフィールドを展開して、インデックステーブルを避けることができますか?私は、Luaの5.3.3コンパイラを使用する予定です。たとえば、次のように一般的なLuaランタイムはテーブル参照を最適化しますか?

local Types = { 
    A = 1, 
    B = 2, 
    C = 3 
}; 

print(Types.A); 

でした。この中にターン:

print(1); 

か何かのような(おそらくより良い):直接

local A = 1; 
print(A); 

答えて

3

いいえ、Luaはそのコードをそのまま実行します。これはコンパイラの単純さのコストです。
luacからの出力を参照してください:

local Types = { 
    A = 1, 
    B = 2, 
    C = 3 
} 

do 
    local print = print 
    local _ENV = Types 
    print(A) 
end 

をしかしは、あなたがこれをしたい理由に熟考ん:あなたはグローバルな名前を解決するために、一時的なテーブルとしてTypesを設定することができます

main <2.lua:0,0> (8 instructions at 0x235bb10) 
0+ params, 3 slots, 1 upvalue, 1 local, 7 constants, 0 functions 
    1 [1] NEWTABLE 0 0 3 
    2 [2] SETTABLE 0 -1 -2 ; "A" 1 
    3 [3] SETTABLE 0 -3 -4 ; "B" 2 
    4 [4] SETTABLE 0 -5 -6 ; "C" 3 
    5 [7] GETTABUP 1 0 -7 ; _ENV "print" 
    6 [7] GETTABLE 2 0 -1 ; "A" 
    7 [7] CALL  1 2 1 
    8 [7] RETURN  0 1 
+0

Hum、私はそれが名前空間のようなテーブルを検出すると予想していました.Luaは最適化された高速で軽量な言語だと言われています。 – Hydro

+0

それは速いです。もっと速いスピードが必要な場合、そして5.3バージョンのLuaがあなたにとって重要でないなら、あなたはLuaJITを試すことができます(Lua 5.1 API + 5.2からのいくつかの機能をサポートしています)。 GoogleのV8よりも優れている。 – Vlad

+0

以前はLuaJITについて聞いたことがあります。私はそのような最適化があるのか​​分からなかった。 – Hydro

1

_ENVを設定する前に、printを保存する必要があることに注意してください。

関連する問題