أداء الحلقات التكرارية
جزء من قسم Logic & Flow في رحلة C# على Coddy — الدرس 13 من 66.
تحسين أداء الحلقات يمكن أن يحسن بشكل كبير من سرعة تطبيقك، خاصة مع مجموعات البيانات الكبيرة.
قم بتخزين طول المجموعة في متغير قبل الحلقة:
int[] numbers = { 1, 2, 3, 4, 5 };
int length = numbers.Length; // تخزين الطول مرة واحدة
for (int i = 0; i < length; i++) // استخدام القيمة المخزنة
{
Console.WriteLine(numbers[i]);
}تجنب استدعاءات الدوال المتكررة في شروط الحلقات، على سبيل المثال:
for (int i = 0; i < GetCount(); i++)
{
// جسم الحلقة
}يتم استدعاء التابع GetCount() في كل تكرار للحلقة. وهذا يعني أنه إذا تم تشغيل الحلقة 1000 مرة، فسيتم تنفيذ GetCount() 1000 مرة أيضاً، لأن شرط الحلقة يتم تقييمه قبل كل تكرار.
إليك كيفية القيام بذلك بشكل صحيح:
int count = GetCount();
for (int i = 0; i < count; i++)
{
// جسم الحلقة
}يتم استدعاء GetCount() مرة واحدة فقط قبل بدء الحلقة، ويتم تخزين قيمتها في المتغير count. ثم تستخدم الحلقة هذه القيمة المخزنة لجميع التكرارات، مما يلغي الحاجة إلى استدعاء الطريقة بشكل متكرر.
يمكن لهذا النهج أن يجعل الكود الخاص بك يعمل بشكل أسرع من خلال تقليل العمليات المتكررة، خاصة عندما تقوم الطريقة التي يتم استدعاؤها بإجراء عمليات حسابية معقدة أو الوصول إلى البيانات.
التحدي
سهلقم بإنشاء دالة تسمى optimizedSum تقوم بما يلي:
- تأخذ مصفوفة من الأعداد الصحيحة كمعامل (parameter)
- تحسب مجموع كل العناصر
- تنفذ كلاً من النهج المحسن وغير المحسن:
- غير محسن: استدعاء
array.Lengthفي كل تكرار للحلقة - محسن: تخزين الطول مؤقتاً قبل الحلقة
- غير محسن: استدعاء
- تعيد النتيجة من النهج المحسن
ورقة مرجعية
قم بتخزين طول المجموعة في متغير قبل الحلقة لتجنب الوصول المتكرر للخاصية:
int[] numbers = { 1, 2, 3, 4, 5 };
int length = numbers.Length; // Store length once
for (int i = 0; i < length; i++) // Use stored value
{
Console.WriteLine(numbers[i]);
}تجنب استدعاءات الدوال المتكررة في شروط الحلقة عن طريق تخزين النتيجة مؤقتاً:
// Inefficient - method called every iteration
for (int i = 0; i < GetCount(); i++)
{
// Loop body
}
// Optimized - method called once
int count = GetCount();
for (int i = 0; i < count; i++)
{
// Loop body
}جرّب بنفسك
public class OptimizedSum
{
// قم بتنفيذ طريقة optimizedSum
public static int optimizedSum(int[] numbers)
{
// اكتب الكود الخاص بك هنا
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادتعريف وتهيئة المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادالمصفوفات المتعرجة (Jagged Arrays)عمليات المصفوفات الشائعةمراجعة - المصفوفات متعددة الأبعاد4تقنيات التحكم في التدفق
الإرجاع المبكرشروط الحمايةجمل القفز (goto)Break و Continueتسطيح الشروط المتداخلة7المعاملات المنطقية المتقدمة
التقييم المختصرالمعاملات المنطقية الشرطيةأولوية المعاملاتمراجعة - المعاملات المتقدمة2اتخاذ القرارات المتقدم
الشروط المتعددةالمنطق البولياني المعقدمقارنة بين If و Switchجمل Switch المتداخلةمراجعة - القرارات المتقدمة5معالجة الاستثناءات
أساسيات Try-Catchأنواع الاستثناءاتكتل Catch المتعددةالتعامل مع الملفاتكتلة FinallyUsing مقابل Try-Finallyاستثناءات مخصصةمراجعة - معالجة الأخطاء8نظام تحليل البيانات
إعداد جمع البياناتمنطق إدخال البيانات11HashSet الجزء الأول
ما هو الـ HashSet؟إضافة عنصرحذف عنصرالتحقق من وجود عنصرالفراغ والحجمملخص - HashSet3تحسينات الحلقات التكرارية
أداء الحلقات التكراريةالتكرار عبر البيانات المعقدةأنواع الحلقات التكراريةإعادة هيكلة الحلقات التكراريةملخص - الحلقات المحسنة6التعامل مع الـ Null
أساسيات الـ Null Referenceأنواع القيم القابلة للـ Nullأنماط التحقق من الـ Nullالبرمجة الدفاعيةملخص - أمان الـ Null