Lua 5.3の命令セット入門
MOVE
を基準として、命令ごとにどれくらい時間がかかるかを比べた。当たり前だけれど、メモリ確保は時間がかかるので避ける。
MOVE
とだいたい同じくらい
MOVE
LOADK
LOADBOOL
GETUPVAL
SETUPVAL
UNM
NOT
MOVE
の1.5倍くらいまで
ADD
SUB
MUL
BOR
BXOR
BNOT
VARARG
(書き込み先がレジスタ1個の場合)
MOVE
の3倍くらいまで
DIV
BAND
SHL
SHR
LEN
TEST
TESTSET
CLOSURE
(上位値を持たない空の関数の場合)
MOVE
の5倍くらいまで
GETTABUP
(整数インデックス)GETTABLE
(整数インデックス)SETTABUP
(整数インデックス)SETTABLE
(整数インデックス)POW
EQ
LT
LE
MOVE
の8倍くらいまで
MOD
IDIV
それ以上
おしなべてTAILCALL
はCALL
よりも速い。速くならない場合もあるので、高速化を目的として、無理にTAILCALL
を使う必要はないかもしれない。それよりも、おそらく、メモリ確保のコストが効いている。
関数呼び出しのコストは、だいたいMOVE
の15〜30倍程度だと見なせばよいと思われる。
NEWTABLE
CONCAT
CALL
TAILCALL