مفاضلات التنفيذ الكسول والفوري
اعرف متى يفيد التنفيذ الكسول ومتى يضر.
مفاضلات التنفيذ الكسول والفوري درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
لا توجد وجبة مجانية
التقييم الكسول ليس أسرع دائمًا. فهو يستبدل التخصيص المسبق بتكلفة إضافية عند كل وصول، ويغيّر توقيت تنفيذ الآثار الجانبية. ومعرفة هذه المقايضات تساعدكم على الاختيار الصحيح.
التقييم الكسول يتفوق: استهلاك جزئي
لا نحتاج إلا إلى جزء من تحويل ضخم — لذلك يتجاوز التقييم الكسول بقية العناصر:
let data = Array(1...1_000_000)
let top = data.lazy.map { $0 * 2 }.prefix(3)
print(Array(top)) // [2, 4, 6] -- 999,997 transforms skippedالتقييم الفوري يتفوق: إعادة استخدام كاملة
إذا كررتم التكرار على النتيجة مرات عديدة، يحسبها التقييم الفوري مرة واحدة؛ أما التقييم الكسول فيعيد الحساب في كل تكرار:
let doubled = [1, 2, 3].map { $0 * 2 } // computed once
print(doubled.reduce(0, +)) // 12
print(doubled.max()!) // 6 -- no recomputeالتقييم الكسول يعيد الحساب
تنفذ نافذة العرض الكسولة نفسها العمل من جديد في كل تكرار:
var work = 0
let view = [1, 2, 3].lazy.map { (n: Int) -> Int in work += 1; return n }
_ = view.reduce(0, +)
_ = view.max()
print(work) // 6 -- transformed twiceالتكلفة الإضافية لكل عنصر
تغلف كل خطوة كسولة التسلسل في نوع آخر، وتستدعي الإغلاقات عنصرًا بعد عنصر. في المصفوفات الصغيرة جدًا، قد تتجاوز هذه التكلفة الإضافية التوفير الناتج عن تجنب التخصيص.
المصفوفة الصغيرة: التقييم الفوري مناسب
بالنسبة إلى عدد قليل من العناصر التي ستُستهلك بالكامل، يُفضّل استخدام التقييم الفوري العادي — فهو أبسط، والتخصيص ضئيل:
let nums = [3, 1, 2]
let sorted = nums.map { $0 + 1 }.sorted()
print(sorted) // [2, 3, 4]يختلف توقيت الآثار الجانبية
مع التقييم الكسول، يُنفّذ جسم الإغلاق في وقت لاحق من السطر الذي يعرّفه. تجنبوا الاعتماد على الآثار الجانبية داخل التحويلات الكسولة:
var log: [Int] = []
let v = [1, 2].lazy.map { (n: Int) -> Int in log.append(n); return n }
print(log) // [] -- nothing ran yet
_ = Array(v)
print(log) // [1, 2]عمليات تفرض التقييم الفوري
يجب على بعض العمليات قراءة التسلسل بأكمله على أي حال، ولذلك لا يقدم التقييم الكسول فائدة في هذه الحالة:
let nums = Array(1...10)
print(nums.lazy.map { $0 * 2 }.sorted()) // sorted must see all -> [2,4,...,20]
print(nums.lazy.map { $0 }.count) // count walks everythingالتقييم الكسول مع contains
تستفيد العمليات التي تتوقف مبكرًا، مثل contains(where:)، من التقييم الكسول عند التعامل مع مدخلات كبيرة:
let big = Array(1...1_000_000)
let found = big.lazy.map { $0 * 2 }.contains { $0 == 8 }
print(found) // true -- stops at element 4قائمة تحقق لاتخاذ القرار
استخدموا التقييم الكسول عندما: يكون المصدر كبيرًا، وتحتفظون بجزء منه فقط (prefix / first / contains)، وتجرون تكرارًا واحدًا. واستخدموا التقييم الفوري عندما: تكون المصفوفة صغيرة، أو تعيدون استخدام النتيجة، أو تكون سهولة القراءة أهم من التحسينات الدقيقة.
let huge = Array(1...100_000)
let first = huge.lazy.filter { $0 % 9973 == 0 }.first
print(first!) // 9973قيسوا الأداء ولا تخمّنوا
غالبًا ما يكون حدس الأداء خاطئًا. عندما يكون الأداء مهمًا، قارنوا نسختَي التقييم الفوري والكسول باستخدام بيانات واقعية قبل اعتماد التقييم الكسول.
let nums = Array(1...50)
let eager = nums.filter { $0 > 25 }.count
let lazyC = nums.lazy.filter { $0 > 25 }.count
print(eager == lazyC) // true -- same answer, profile for speedتحقق سريع
متى يكون التقييم الفوري خيارًا أفضل من التقييم الكسول؟
مراجعة
لقد تعلمتم المقايضات:
- يتفوق التقييم الكسول مع المصادر الكبيرة عند الاستهلاك الجزئي وفي التمرير لمرة واحدة
- يتفوق التقييم الفوري مع المصفوفات الصغيرة والنتائج التي يُعاد استخدامها (فالتقييم الكسول يعيد الحساب)
- تُنفّذ الآثار الجانبية في التحويلات الكسولة لاحقًا — تجنبوا الاعتماد عليها
- قيسوا الأداء قبل تحسينه
التالي: إنشاء تسلسلات كسولة مخصصة.
الأسئلة الشائعة
هل درس «مفاضلات التنفيذ الكسول والفوري» مجاني؟
نعم — نص درس «مفاضلات التنفيذ الكسول والفوري» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «مفاضلات التنفيذ الكسول والفوري»؟
اعرف متى يفيد التنفيذ الكسول ومتى يضر. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «مفاضلات التنفيذ الكسول والفوري»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الخاصية lazy
- map و filter الكسولان
- مفاضلات التنفيذ الكسول والفوري
- إنشاء تسلسلات كسولة مخصصة