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

それ以上

おしなべてTAILCALLCALLよりも速い。速くならない場合もあるので、高速化を目的として、無理にTAILCALLを使う必要はないかもしれない。それよりも、おそらく、メモリ確保のコストが効いている。

関数呼び出しのコストは、だいたいMOVEの15〜30倍程度だと見なせばよいと思われる。

  • NEWTABLE
  • CONCAT
  • CALL
  • TAILCALL