0Pricing
Lua Academy · บทเรียน

การเขียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวมสถาปัตยกรรม LuaJIT
  2. การเขียน Lua ที่เหมาะกับ JIT
  3. การสร้างโพรไฟล์ด้วย jit.p และ perf
  4. รูปแบบการวัดประสิทธิภาพ
← กลับไปที่ Lua Academy