JIT 친화적인 Lua 작성
JIT 중단을 피하기 위해 유형을 안정적으로 유지하고 테이블 크기 변경을 줄이며 지역 변수를 사용합니다.
JIT 친화적인 Lua 작성은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 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에서는 레지스터에 할당됨). 전역 변수와 상위 값에 대한 접근은 더 느립니다. 자주 실행되는 함수의 시작 부분에서 전역 값을 지역 변수로 캐시하세요.
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부터 시작하는 정수 키 사용). 같은 테이블에서 정수 키와 문자열 키를 섞으면 배열 최적화가 적용되지 않습니다.
핫 내부 반복문에서 클로저 생성 피하기
반복할 때마다 새 클로저를 생성하면 메모리가 할당되고 가비지 컬렉션 부담이 커질 수 있습니다. 반복문 밖에서 클로저를 미리 할당하세요.
-- 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(아직 구현되지 않음) 기능 피하기
일부 Lua 기능은 LuaJIT의 JIT에 구현되어 있지 않습니다(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/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“JIT 친화적인 Lua 작성”에서 뭘 배우나요?
JIT 중단을 피하기 위해 유형을 안정적으로 유지하고 테이블 크기 변경을 줄이며 지역 변수를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“JIT 친화적인 Lua 작성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- LuaJIT 아키텍처 개요
- JIT 친화적인 Lua 작성
- jit.p와 perf를 이용한 프로파일링
- 벤치마크 패턴