0Pricing
Lua Academy · レッスン

ベンチマークパターン

os.clockを使って信頼できるマイクロベンチマークを記述し、よくある落とし穴を避けます。

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

ベンチマークを行う理由

マイクロベンチマークは、特定のコード断片の性能を単独で測定します。直感に頼らず、最適化によって実際に速度が向上したかどうかを検証できます。

基本的なベンチマークのテンプレート

コードをループで囲み、os.clock()で経過時間を測定して、反復回数で割ります。

local N = 1e6
local t0 = os.clock()
for i = 1, N do
  -- code to benchmark
end
local elapsed = os.clock() - t0
print(("%.2f ns/op"):format(elapsed / N * 1e9))

ウォームアップパス

計測前にウォームアップパスを実行し、LuaJITにトレースをコンパイルさせます。ウォームアップを行わないと、最初の計測にはJITコンパイルのオーバーヘッドが含まれます。

for i = 1, 1000 do hotFunction(i) end  -- warm up
local t0 = os.clock()
for i = 1, N do hotFunction(i) end
local elapsed = os.clock() - t0

デッドコード削除を防ぐ

JITは、結果が使われていない計算を削除することがあります。結果を変数に累積して、ベンチマークが正しく計測されるようにしてください。

local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum)  -- prevent elimination

2つのアプローチを比較する

同じ条件で代替実装のベンチマークを行います。OSのスケジューリングによるノイズを最小限に抑えるため、交互に実行するか、複数回実行してください。

local function approach1() -- ...
end
local function approach2() -- ...
end
local function bench(fn, n)
  local t = os.clock()
  for _ = 1, n do fn() end
  return os.clock() - t
end
print("A:", bench(approach1, 1e5))
print("B:", bench(approach2, 1e5))

統計分析

ベンチマークを複数回実行し、最小値、最大値、中央値を計算します。GCによる一時停止やOSのスケジューリングに起因する外れ値は除外してください。

メモリのベンチマーク

実行時間と合わせてメモリ割り当ても測定します。

collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))

GCの干渉を避ける

純粋な計算時間を測定するため、計測前にGCを停止します。計測後に再開してください。

collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")

現実的なベンチマークとマイクロベンチマーク

マイクロベンチマークでは小さなコード断片を最適化できますが、実環境での性能を反映するとは限りません。改善効果は必ずアプリケーション全体のプロファイルで検証してください。

ベンチマーク用ユーティリティ

再利用可能なbenchmark(name, fn, iters)ユーティリティを作成し、すべてのベンチマークで一貫した書式の結果を出力できるようにします。

local function benchmark(name, fn, iters)
  iters = iters or 1e5
  for _ = 1, iters // 10 do fn() end  -- warm up
  local t = os.clock()
  for _ = 1, iters do fn() end
  local ns = (os.clock() - t) / iters * 1e9
  print(("%-30s %8.1f ns/op"):format(name, ns))
end

CIでのベンチマーク

性能のリグレッションを検出するため、CIでベンチマークを実行します。ベンチマークが定義したしきい値(例:10%)を超えて悪化した場合は、アラートを出します。

ベンチマークに関する質問

LuaJITコードのベンチマークでウォームアップパスが重要なのはなぜですか?

まとめ:ベンチマークのパターン

ウォームアップパスを実行し、結果を使用してデッドコード削除を防ぎ、os.clock()で測定し、GCを制御し、安定した測定値を得るために複数回試行します。一貫性を保つため、再利用可能なベンチマーク用ユーティリティを作成してください。

よくある質問

「ベンチマークパターン」レッスンは無料ですか?

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

「ベンチマークパターン」で何を学びますか?

os.clockを使って信頼できるマイクロベンチマークを記述し、よくある落とし穴を避けます。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「ベンチマークパターン」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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