0Pricing
Lua Academy · レッスン

JITフレンドリーなLuaの記述

JITのフォールバックを避けるため、型を安定させ、テーブルの拡張を抑え、ローカル変数を使います。

「JITフレンドリーなLuaの記述」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

JITフレンドリーが重要な理由

JITコンパイラーは、型が安定した、予測可能なコードで最も効果を発揮します。予測できない型や分岐はトレースの中断やバイアウトを引き起こし、インタープリターへの復帰につながります。

型を安定させる

変数には常に同じ型の値を保持させるべきです。変数が数値と文字列の間で切り替わると、JITは特化できず、あらゆる場所に型チェックを挿入する必要があります。

-- BAD: type unstable
local x = 1
if cond then x = "one" end  -- JIT cannot specialize x

-- GOOD: separate variables
local xNum = 1
local xStr = "one"

ローカル変数を使う

ローカル変数はLuaスタックに格納されます(JITではレジスタに割り当てられます)。グローバル変数やupvalueへのアクセスはより遅くなります。ホットな関数の先頭でグローバル変数をローカル変数にキャッシュしてください。

local sin = math.sin  -- cache as local
for i = 1, 1e6 do
  result = sin(i)  -- fast local access
end

ループ内でのテーブルのサイズ変更を避ける

予想されるサイズでテーブルを事前に確保します。ループ内でテーブルを拡張すると(次の2の累乗の境界を越えると)、配列の再確保とコピーが発生し、JITのトレースが壊れます。

local t = table.new(1000, 0)  -- LuaJIT extension
for i = 1, 1000 do t[i] = i end

配列とハッシュの混在を避ける

配列部分は配列として維持します(1から始まる整数キーを使用します)。同じテーブルで整数キーと文字列キーを混在させると、配列の最適化が妨げられます。

ホットな内部ループでクロージャを避ける

反復ごとに新しいクロージャを作成するとメモリが確保され、GCの負荷が高くなる可能性があります。クロージャはループの外で事前に確保してください。

-- BAD: closure created every iteration
for i = 1, 1e6 do
  local fn = function() return i end  -- allocation!
end

-- GOOD: use a local function outside
local function work(i) return i end
for i = 1, 1e6 do work(i) end

多相呼び出しを避ける

同じ呼び出し位置から異なる関数オブジェクトを呼び出すと(反復ごとに異なる関数を呼び出すと)、JITがインライン化できない多相呼び出し位置が作られます。

NYI(未実装)機能を避ける

LuaJITのJITには、まだ実装されていないLuaの機能(NYI)があります。例として、一部の指定子を使ったstring.format、JITトレース内のpcall、pairs/nextなどです。jit.vの出力を確認してください。

トレースの詳細表示にjit.vを使う

詳細なJIT出力を有効にすると、どのトレースがコンパイルされ、どのトレースが中断したかを確認できます。

-- Run script with: luajit -jv script.lua
-- Or in code:
jit.attach(function(event, ...)
  if event == "abort" then print("ABORT:", ...) end
end, "all")

固定サイズ配列を使う

配列のサイズが既知で固定されている場合、FFIで定数サイズのC配列として宣言すると、Luaテーブルより大幅に高速になることがあります。

最適化の前にプロファイリングする

まず測定してください。早すぎる最適化は諸悪の根源です。JIT向けの書き換えに時間をかける前にプロファイリングを行い、実際にホットな処理経路を見つけてください。

JITフレンドリーの質問

ホットな内部ループ内でクロージャの作成を避けるべきなのはなぜですか。

復習:JITフレンドリーなLua

型を安定させ、ローカル変数を使い、テーブルを事前に確保し、ホットループ内のクロージャを避け、jit.vでNYI機能を確認します。まずプロファイリングを行い、ボトルネックだと確認できた箇所だけを最適化してください。

よくある質問

「JITフレンドリーなLuaの記述」レッスンは無料ですか?

はい。「JITフレンドリーなLuaの記述」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「JITフレンドリーなLuaの記述」で何を学びますか?

JITのフォールバックを避けるため、型を安定させ、テーブルの拡張を抑え、ローカル変数を使います。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「JITフレンドリーなLuaの記述」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. LuaJITアーキテクチャの概要
  2. JITフレンドリーなLuaの記述
  3. jit.pとperfによるプロファイリング
  4. ベンチマークパターン
← Lua Academyに戻る