"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > المعيار مع جولانج

المعيار مع جولانج

تم النشر بتاريخ 2024-11-04
تصفح:263

مرحبا غوفرز؟

في منشور المدونة هذا، سأوضح لك كيفية استخدام أداة رائعة مضمنة في حزمة اختبار #golang. كيف يمكنك اختبار أداء جزء من التعليمات البرمجية أو وظيفة؟ استخدم اختبارات المعيارية.

دعنا نذهب.

في هذا الاختبار، سأستخدم رقم فيبوناتشي الكلاسيكي أو تسلسل فيبوناتشي، والذي يتم تحديده بواسطة:

if (x 



وهذا التسلسل مهم لأنه يظهر في عدة أجزاء من الرياضيات والطبيعة أيضًا، كما هو موضح أدناه:

Benchmark with Golang

هناك عدة طرق لتنفيذ هذا الرمز، وسأختار طريقتين لاختبارنا المعياري: الطرق العودية والتكرارية لحسابها. الهدف الرئيسي من الوظائف هو توفير الموضع وإرجاع رقم فيبوناتشي عند هذا الموضع.

طريقة العودية

// 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

دعونا نحلل بمساعدة هذه الصورة:

Benchmark with Golang

وفقًا للصورة، لدينا 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 أو أدوات أخرى من حزمة الاختبار المضمنة، لتحديد واختبار أداء الكود الخاص بك سيئة وكيفية تحسينها.

ملاحظة جانبية: ليست كل الأكواد الجميلة للعين تكون أكثر أداءً.

تمرين إضافي

هل يمكنك إيجاد طريقة أفضل لتحسين الوظيفة العودية؟ (نصيحة: استخدم البرمجة الديناميكية). تشرح هذه المقالة سبب كون الإستراتيجية العودية أفضل بالنسبة لبعض الأعداد الصغيرة.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/pedrobertao/benchmark-with-golang-md4?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3