أنماط القياس المعياري
اكتب اختبارات أداء دقيقة باستخدام os.clock وتجنّب الأخطاء الشائعة
أنماط القياس المعياري درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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مقارنة نهجين
اختبروا التطبيقات البديلة في ظروف متطابقة. شغّلوها بالتناوب أو مرات متعددة لتقليل ضوضاء جدولة نظام التشغيل.
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 أو جدولة نظام التشغيل.
قياس الذاكرة
قيسوا تخصيص الذاكرة بالتزامن مع قياس الزمن.
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/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط القياس المعياري»؟
اكتب اختبارات أداء دقيقة باستخدام os.clock وتجنّب الأخطاء الشائعة تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أنماط القياس المعياري»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نظرة عامة على بنية LuaJIT
- كتابة Lua المتوافقة مع JIT
- تحليل الأداء باستخدام jit.p وperf
- أنماط القياس المعياري