مرحبا غوفرز؟
في منشور المدونة هذا، سأوضح لك كيفية استخدام أداة رائعة مضمنة في حزمة اختبار #golang. كيف يمكنك اختبار أداء جزء من التعليمات البرمجية أو وظيفة؟ استخدم اختبارات المعيارية.
دعنا نذهب.
في هذا الاختبار، سأستخدم رقم فيبوناتشي الكلاسيكي أو تسلسل فيبوناتشي، والذي يتم تحديده بواسطة:
if (xوهذا التسلسل مهم لأنه يظهر في عدة أجزاء من الرياضيات والطبيعة أيضًا، كما هو موضح أدناه:
هناك عدة طرق لتنفيذ هذا الرمز، وسأختار طريقتين لاختبارنا المعياري: الطرق العودية والتكرارية لحسابها. الهدف الرئيسي من الوظائف هو توفير الموضع وإرجاع رقم فيبوناتشي عند هذا الموضع.
طريقة العودية
// main.go func fibRecursive(n int) int { if nالطريقة التكرارية
// main.go func fibIterative(position uint) uint { slc := make([]uint, position) slc[0] = 1 slc[1] = 1 if positionلم يتم تحسين هذه الأساليب، لكن نتائج الاختبارات تختلف بشكل كبير حتى بالنسبة لعدد صغير. سترى هذا في الاختبارات. لمتابعة الكود، يمكنك النقر هنا.
الآن، بالنسبة لاختبارات المعيارية، دعنا نكتب بعض الاختبارات في ملف _main_test.go. باستخدام وثائق Golang على المقياس المعياري، يمكنك إنشاء الوظائف المراد اختبارها على النحو التالي:
// main_test.go // The key is to start every function you want to benchmark with the keyword Benchmark and use b *testing.B instead of t *testing.T as input func BenchmarkFibIterative(b *testing.B) { // Use this for-loop to ensure the code will behave correctly. // Now, you can put the function or piece of code you want to test for i := 0; iسؤال قبل المتابعة: أيهما أسرع؟
لنجري الاختبار على رقم صغير (10) وعلى رقم أكبر قليلاً (80). لتشغيل الاختبارات المعيارية ، ما عليك سوى تشغيل الأمر:
اذهب للاختبار -bench=NameoftheFunction
إذا كنت تريد معرفة المزيد عن هذا الأمر، تحقق هنا.
الاختبار الأول: الموضع=10
//(fibIterative) Results: cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibIterative-8 24491042 42.50 ns/op PASS ok playground 1.651sدعونا نحلل بمساعدة هذه الصورة:
وفقًا للصورة، لدينا 8 مراكز للاختبارات، ولا يوجد حد زمني (سيتم تشغيلها حتى الانتهاء). استغرق الأمر 1.651 ثانية لإكمال المهمة.
==== Extra ==== We got 24,491,042 iterations (computations), and each iteration (op) took 42.50 ns. Doing some math, we can calculate how much time one op took: 42.50 ns/op with 1 ns = 1/1,000,000,000 s op ≈ 2.35270590588e-12 s ==== Extra ====هذه نتيجة جيدة. دعونا نتحقق من الدالة العودية للموضع 10:
// Results BenchmarkFibRecursive-8 6035011 187.8 ns/op PASS ok playground 1.882sيمكننا أن نرى أن الأمر استغرق 1.882 ثانية لإكمال المهمة.
فازت الوظيفة التكرارية ببضعة ديسي ثانية. لنجرب اختبارًا آخر باستخدام:
الموضع 50
// Results for the Iterative Function cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibIterative-8 27896118 45.37 ns/op PASS ok playground 2.876s // Results for the Recursive Function cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibRecursive-8 6365198 186.3 ns/op PASS ok playground 1.918sرائع! الآن أصبحت الوظيفة العودية أسرع؟
دعونا ننتهي برقم أكبر قليلاً.
الموضع 80
// Results for the Iterative Function cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibIterative-8 5102344 229.5 ns/op PASS ok playground 1.933s // Results for the Recursive Function // My poor PC couldn’t handle it, so I had to reduce the position to 50 just to get some results printed. cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibRecursive-8 1 44319299474 ns/op PASS ok playground 44.951sالفرق شاسع. بالنسبة للموضع 80، استغرق النهج التكراري حوالي ثانيتين. بالنسبة للموضع 50، استغرقت الوظيفة العودية حوالي 45 ثانية. يوضح هذا أهمية قياس الكود الخاص بك عندما يبدأ مشروع Golang الخاص بك في التباطؤ.
خاتمة
إذا كان كود الإنتاج الخاص بك يعمل ببطء أو كان أبطأ بشكل غير متوقع، فيمكنك استخدام هذه التقنية، جنبًا إلى جنب مع pprof أو أدوات أخرى من حزمة الاختبار المضمنة، لتحديد واختبار أداء الكود الخاص بك سيئة وكيفية تحسينها.
ملاحظة جانبية: ليست كل الأكواد الجميلة للعين تكون أكثر أداءً.
تمرين إضافي
هل يمكنك إيجاد طريقة أفضل لتحسين الوظيفة العودية؟ (نصيحة: استخدم البرمجة الديناميكية). تشرح هذه المقالة سبب كون الإستراتيجية العودية أفضل بالنسبة لبعض الأعداد الصغيرة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3