การเขียน Lua ที่เหมาะกับ JIT
หลีกเลี่ยงการออกจากเส้นทาง JIT โดยรักษาชนิดข้อมูลให้คงที่ ลดการปรับขนาดตาราง และใช้ตัวแปรเฉพาะที่
การเขียน Lua ที่เหมาะกับ JIT เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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หลีกเลี่ยงการปรับขนาดตารางในลูป
จัดสรรตารางล่วงหน้าให้มีขนาดตามที่คาดไว้ การขยายตารางในลูป (เมื่อข้ามขอบเขตกำลังสองของสองถัดไป) จะจัดสรรใหม่และคัดลอกอาร์เรย์ ทำให้เส้นทางติดตามของ 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 บางอย่างยังไม่รองรับในการทำงานแบบ JIT ของ LuaJIT (NYI) ได้แก่ string.format ที่ใช้ตัวระบุรูปแบบบางชนิด, pcall ภายในเส้นทางติดตามของ JIT และ 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")ใช้อาร์เรย์ขนาดคงที่
เมื่ออาร์เรย์มีขนาดคงที่ที่ทราบแน่นอน การประกาศเป็นอาร์เรย์ C ขนาดคงที่ผ่าน FFI อาจเร็วกว่าใช้ตาราง Lua อย่างมาก
วิเคราะห์ประสิทธิภาพก่อนปรับให้เหมาะสม
วัดผลก่อน การปรับให้เหมาะสมก่อนเวลาอันควรเป็นต้นเหตุของปัญหาทั้งปวง ให้วิเคราะห์ประสิทธิภาพเพื่อค้นหาเส้นทางที่ร้อนจริงก่อนเสียเวลาเขียนโค้ดใหม่ให้เหมาะกับ JIT
คำถามเกี่ยวกับโค้ดที่เหมาะกับ JIT
เหตุใดจึงควรหลีกเลี่ยงการสร้างคลอสเชอร์ภายในลูปด้านในที่ร้อน
ทบทวน: Lua ที่เหมาะกับ JIT
รักษาชนิดข้อมูลให้คงที่ ใช้ตัวแปรเฉพาะที่ จัดสรรตารางล่วงหน้า หลีกเลี่ยงคลอสเชอร์ในลูปร้อน และตรวจสอบความสามารถ NYI ด้วย jit.v วิเคราะห์ประสิทธิภาพก่อน แล้วปรับเฉพาะคอขวดที่พิสูจน์แล้วเท่านั้น
คำถามที่พบบ่อย
บทเรียน “การเขียน Lua ที่เหมาะกับ JIT” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเขียน Lua ที่เหมาะกับ JIT” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเขียน Lua ที่เหมาะกับ JIT”
หลีกเลี่ยงการออกจากเส้นทาง JIT โดยรักษาชนิดข้อมูลให้คงที่ ลดการปรับขนาดตาราง และใช้ตัวแปรเฉพาะที่ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การเขียน Lua ที่เหมาะกับ JIT” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมสถาปัตยกรรม LuaJIT
- การเขียน Lua ที่เหมาะกับ JIT
- การสร้างโพรไฟล์ด้วย jit.p และ perf
- รูปแบบการวัดประสิทธิภาพ