توصيف كود Rust: إيجاد نقاط الاختناق للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا توصيف كود Rust؟

\n\n

تشتهر Rust بسرعتها وأمانها، ولكن حتى أسرع كود يمكن أن يعمل ببطء إذا كان يحتوي على نقاط اختناق. التوصيف هو عملية قياس أداء البرنامج: وقت التنفيذ، تحميل المعالج، الذاكرة، ومقاييس أخرى. بالنسبة لمطوري Rust المبتدئين، هذه مهارة لا غنى عنها تسمح بتحويل الكود "العامل فقط" إلى كود فعال وسريع.

\n\n

تخيل أنك كتبت محللاً للسجلات أو لعبة بلغة Rust. كل شيء يتم تجميعه، لكن البرنامج يعمل لفترة أطول من المتوقع. بدلاً من التخمين حول أي جزء من الكود يسبب البطء، يمكنك استخدام أدوات التوصيف التي ستظهر "النقاط الساخنة" (hotspots) بدقة. في هذه المقالة، سنستعرض الأدوات الأساسية لتوصيف Rust للمبتدئين: cargo-flamegraph و perf والقياسات البسيطة باستخدام std::time::Instant.

\n\n

1. الطريقة الأسهل: قياس الوقت باستخدام std::time::Instant

\n\n

قبل الانتقال إلى الأدوات المعقدة، تعلم كيفية قياس وقت تنفيذ أجزاء معينة من الكود. هذه طريقة أساسية لكنها فعالة للمبتدئين.

\n\n

مثال: قياس وقت تنفيذ دالة

\n\n
use std::time::Instant;\n\nfn slow_function() {\n    let mut sum = 0u64;\n    for i in 0..1_000_000 {\n        sum += i;\n    }\n    println!("المجموع: {}", sum);\n}\n\nfn main() {\n    let start = Instant::now();\n    slow_function();\n    let duration = start.elapsed();\n    println!("وقت التنفيذ: {:?}", duration);\n}\n
\n\n

سيخرج هذا الكود الوقت الدقيق لتشغيل slow_function. ومع ذلك، هذا الأسلوب غير مناسب للمشاريع الكبيرة: ستحتاج إلى وضع القياسات يدويًا في كل مكان مشبوه.

\n\n

متى يكون هذا مفيدًا؟

\n
    \n
  • تريد التحقق بسرعة من فرضية حول دالة بطيئة.
  • \n
  • لا توجد إمكانية لتثبيت أدوات إضافية.
  • \n
  • أنت تعمل مع كود أحادي الخيط بدون منطق معقد.
  • \n
\n\n

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

\n\n

2. التوصيف باستخدام perf (لينكس)

\n\n

أداة perf هي أداة توصيف قوية لنظام لينكس تعمل على مستوى النواة. تقوم بجمع عينات (samples) من حيث يقضي البرنامج وقته. للبدء، تأكد من تثبيت perf:

\n\n
sudo apt install linux-tools-common linux-tools-generic  # Ubuntu/Debian\n
\n\n

الخطوة 1: التجميع مع معلومات التصحيح

\n

لكي يتمكن perf من عرض أسماء الدوال وأسطر الكود، قم بتجميع المشروع في وضع debug (أو release مع أعلام debuginfo):

\n\n
cargo build\n# أو\nRUSTFLAGS="-g" cargo build --release\n
\n\n

الخطوة 2: تشغيل التوصيف

\n
perf record -g ./target/debug/برنامجك\nperf report\n
\n\n

العلم -g يقوم بتشغيل تسجيل مكدس الاستدعاءات (call graph). بعد تنفيذ perf report، سترى قائمة تفاعلية من الدوال مرتبة حسب وقت التنفيذ.

\n\n

مثال على التفسير

\n

لنفترض أنك ترى أن 70% من الوقت تستغرقه الدالة Vec::push. قد يعني هذا أنك تقوم بإعادة تخصيص الذاكرة بشكل متكرر. الحل: تخصيص سعة المتجه مسبقًا باستخدام Vec::with_capacity.

\n\n

نصيحة: بالنسبة للمبتدئين، قد يبدو perf معقدًا بسبب كثرة البيانات. ابدأ بـ perf top في الوقت الفعلي لرؤية أي الدوال "ساخنة" الآن.

\n\n

3. التصور باستخدام cargo-flamegraph

\n\n

إذا كنت بحاجة إلى صورة مرئية، استخدم cargo-flamegraph. هذه الأداة تنشئ مخططات اللهب (flamegraphs) - رسوم بيانية حيث يعرض عرض المستطيل وقت تنفيذ الدالة، والعمق يظهر ع

المدونات

توصيات الكتب