ويكيبيديا كيف يمكن قياس زمن التنفيذ الفعلي لبرنامج C في نظام Linux؟




نظام linux ويكيبيديا (3)

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

استخدمت getrusage () للحصول على وقت المستخدم ووقت النظام لعملية ، ومن ثم حساب وقت التنفيذ الفعلي بواسطة (وقت المستخدم + وقت النظام). أنا أدير برنامجي على Ubuntu. فيما يلي أسئلتي:

  1. كيف أعرف دقة النقانق ()؟
  2. هل هناك طرق أخرى يمكن أن توفر دقة أعلى من () getrusage؟

إن وظيفة getrusage () هي الطريقة القياسية / المحمولة الوحيدة التي أعرف أنها تحصل على "وقت وحدة المعالجة المركزية المستهلكة".

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

سأكون أيضًا قلقًا بشأن دقة القيم التي يتم إرجاعها. في ظل بعض الحشائش كنت أتوقع أن يتزايد عداد لأي رمز يحدث لتشغيله عندما يحدث جهاز ضبط الوقت IRQ ؛ وبالتالي من الممكن أن تكون عملية محظوظة جدًا (ويتم حظرها باستمرار قبل حدوث IRQ المؤقت) أو سيئ الحظ (وإلغاء الحظر قبل حدوث جهاز ضبط الوقت IRQ). في هذه الحالة ، "محظوظ" قد يعني خنزير وحدة المعالجة المركزية يبدو أنه لا يستخدم وقت وحدة المعالجة المركزية ، و "سيئ الحظ" يمكن أن يعني أن العملية التي تستخدم القليل جدا من الوقت وحدة المعالجة المركزية يشبه خنزير وحدة المعالجة المركزية.

بالنسبة لإصدارات محددة من حبيبات معينة على بنية / هياكل معينة (يمكن أن يعتمد ذلك على ما إذا كان / عندما يتم تجميع النواة مع خيارات تكوين محددة في بعض الحالات) ، فقد تكون هناك بدائل عالية الدقة غير محمولة وغير قياسية ...


يمكنك استخدام هذه الشفرة:

#include <sys/time.h>
struct timeval start, end;
gettimeofday(&start, NULL);
.
.
.
gettimeofday(&end, NULL);
delta = ((end.tv_sec  - start.tv_sec) * 1000000u +
         end.tv_usec - start.tv_usec) / 1.e6;
printf("Time is : %f\n",delta);

سيعرض لك وقت التنفيذ لجزء من التعليمات البرمجية


يمكنك التحقق من الوقت الحقيقي لوحدة المعالجة المركزية لعملية على لينكس من خلال الاستفادة من وظيفة " وقت وحدة المعالجة المركزية " للنواة:

 #include <time.h>

 clock_t start, end;
 double cpu_time_used;

 start = clock();
 ... /* Do the work. */
 end = clock();
 cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

المصدر: http://www.gnu.org/s/hello/manual/libc/CPU-Time.html#CPU-Time

بهذه الطريقة ، تقوم بحساب علامات وحدة المعالجة المركزية (CPU) أو الكمية الحقيقية من الإرشادات التي تعمل عليها وحدة المعالجة المركزية على العملية ، وبالتالي الحصول على مقدار الوقت الفعلي للعمل.





time