محتويات الدورة

Rust / المتقدم / الدرس 17

التنميط والتخصيص وتخطيط البيانات

قِس سلوكًا متكافئًا بشروط بناء معلومة وقلل التخصيص والنسخ دون إضعاف عقود العمر والمجال.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • فصل النمو الخوارزمي عن قياسات الآلة.
  • شرح حجز المتجه والملكية الشرطية عبر Cow.
  • جعل ادعاءات القياس قابلة للإعادة وصادقة إحصائيًا.

تحديد الحمل قبل التحسين

يحتاج ادعاء الأداء حملًا وتوزيع مدخلات ومترجمًا وهدفًا وإعدادًا وطريقة قياس. ابدأ بنتيجة صحيحة وهدف كخفض زمن وسيط أو ذاكرة قصوى لذلك الحمل. يصف التعقيد النمو وتؤثر التخصيصات والمحلية والتفرعات والإدخال في الثوابت. لا يمثل بناء التصحيح الإصدار المحسن، وقد تغير إعدادات الفيض وpanic السلوك. قارن دلالات متكافئة واذكر التباين بدل ادعاء كلفة صفرية أو حاوية أسرع دائمًا.

حجز سعة معلومة دون افتراض التخطيط

يعرف المثال العدد النهائي فيحجز قبل إضافة المربعات. قد يتجنب نموًا متكررًا ولا ينشئ عناصر أو يضمن سعة دقيقة. الناتج فحص صحة لا توقيت مختلق. قارن الحجز وعدمه بأحجام ممثلة وحدّد سياسة فشل التخصيص عند الحاجة. قد يهدر الحجز الضخم الذاكرة ويزيد الفشل. توفر Vec عناصر متجاورة ولا يجعل ذلك تخطيط نوع Rust اعتباطي تمثيلًا ثنائيًا خارجيًا ثابتًا.

rust إنشاء معلوم الحجم بمعنى مفحوص
fn main() {
    let mut squares = Vec::with_capacity(4);
    for value in 1u64..=4 { squares.push(value * value); }
    let total: u64 = squares.iter().sum();
    println!("{} {total}", squares.len());
}
الناتج المتوقع
4 30

التسلسل واحد وأربعة وتسعة وستة عشر، ومجموعه ثلاثون دون وعد بسعة دقيقة أو زمن.

استعارة البيانات الثابتة وامتلاك المحولة

تمثل Cow بيانات مستعارة أو مملوكة بواجهة واحدة. يطبق المثال تحويل حروف ASCII الكبيرة فقط. يستعير الإدخال إن لم يجد كبيرة، وإلا يعيد String محولة مملوكة. يتجنب تخصيص نتيجة ثابتة ويحفظ الملكية عند التغيير. يبقى المستعار مرتبطًا بعمر الإدخال، وتوفر into_owned قيمة مستقلة عند الحاجة. ليس تحويل ASCII خوارزمية Unicode شاملة. لا تغيّر دلالة النص أو القبول صمتًا باسم الأداء.

rust النص نفسه بمساري ملكية مختلفين
use std::borrow::Cow;
fn lower_ascii(text: &str) -> Cow<'_, str> {
    if text.bytes().all(|byte| !byte.is_ascii_uppercase()) {
        Cow::Borrowed(text)
    } else {
        Cow::Owned(text.to_ascii_lowercase())
    }
}
fn main() {
    for input in ["rust", "RUST"] {
        let output = lower_ascii(input);
        println!("{output} {}", matches!(&output, Cow::Borrowed(_)));
    }
}
الناتج المتوقع
rust true
rust false

يبقى الإدخال الصغير مستعارًا، ويحتاج الكبير تحويلًا مملوكًا فتكون علامة الاستعارة false.

قياس عمل لا يحذفه المحسّن بسهولة

يجب أن يستخدم القياس مدخلاته ومخرجاته كي لا يقيس حسابًا حذفه المحسّن. تساعد std::hint::black_box كحاجز تحسين بأفضل جهد، لا كضمان أمني أو بديل لمراجعة القياس. كرر بما يكفي وافصل الإعداد واذكر شمول التخصيص والإدخال. تقيس Instant مدة بخصائص المنصة، فلا تعرضها كناتج مضمون. تحتاج المنمّطات أدوات نظام مدعومة ولا تعني Rust المستقرة تثبيت كل إطار قياس.

حفظ الإثباتات أثناء تغيير التمثيل

قد تقلل الشرائح النسخ ويحتاج المستهلك المنتظر ملكية. قد تحسن تسوية البيانات المحلية وتغير كلفة التحديث والهوية. قد تتيح الأنواع العامة الدمج وتزيد حجم البرنامج، ويناسب الاختيار الديناميكي التوسعة وكلفة البناء. قِس الاختناق وافحص الاختبارات نفسها قبل القبول. لا تستجب لقلق غير مقاس بفهرسة unsafe. وثّق الافتراضات المقاسة واحتفظ بتنفيذ مرجعي واضح إذا كشف انجراف المعنى. تقيد الصحة وحدود الموارد كل تحسين.

الأخطاء الشائعة وإصلاحها

نسخة أسرع تعيد نتائج مختلفة.

لماذا يحدث؟
قارن القياس دلالات مختلفة.
كيف تصلحه؟
استعد العقد قبل تقييم السرعة.
كيف تتجنب تكراره؟
اشترط فحوص صحة لكل تحسين.

خروج Cow مستعارة بعد مصدرها.

لماذا يحدث؟
عوملت الملكية الشرطية كملكية مضمونة.
كيف تصلحه؟
استخدم into_owned أو احتفظ بالمصدر.
كيف تتجنب تكراره؟
وثّق البديلين في عقد العمر.

قياس صغير لا يقيس عملًا تقريبًا.

لماذا يحدث؟
حذف التحسين حسابًا غير مستخدم أو طغى الإعداد.
كيف تصلحه؟
احفظ النتائج الملحوظة وافصل الإعداد عن العمل.
كيف تتجنب تكراره؟
راجع السلوك المولد وكرر حالات ممثلة.

اختبر فهمك

1. أعط نص lower_ascii("Rust Lab") وبديل الملكية، واشرح تعذر إعادة استعارة لهذا التحويل.

اعرض الحل المشروح

النص rust lab في Cow::Owned لحاجة حروف كبيرة إلى الاستبدال. لا تعدّل &str مشتركة نص المستدعي، وتنتهي استعارة String محلية جديدة عند العودة. تحفظ ملكية المحول صلاحيته ويبقى المسار الثابت بلا تخصيص.

2. يظهر التنميط طغيان تخصيص متجه مؤقت مع كل تقرير. اقترح تحسينًا ودليل قبوله.

اعرض الحل المشروح

أعد استخدام مخزن عمل يملكه المستدعي أو احجز حدًا واقعيًا مع مسح العناصر بين الاستدعاءات. افحص تطابق النتائج وعدم حفظ مراجع عبر التعديل والسعة القصوى المقبولة. قِس الاستدعاءات المتكررة وسياسة الاستخدام. لا يكفي تقليل التخصيص إذا ساء الاحتفاظ بالذاكرة أو الزمن.

أهم ما تعلمته

  • قِس حملًا معلومًا بدلالات متكافئة.
  • يجب أن يحفظ تجنب التخصيص الملكية وسياسة النص.
  • اجمع أدلة التحسين وفحوص الصحة.

المراجع الرسمية