قياس الوقت من برنامج متعدد الخيوط

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

سؤالي هو: ما هي وظيفة أفضل لهذه المشكلة؟ clock_gettime() أو mb gettimeofday ()؟ أو ميغابايت شيء آخر؟

إذا كان clock_gettime() ، ثم مع أي ساعة؟ CLOCK_REALTIME أو CLOCK_MONOTONIC؟

باستخدام نظام التشغيل mac OS x (سنو ليوبارد)

1

2 إجابة

إذا كنت تريد الوقت على مدار الساعة ، و clock_gettime() متاحة ، فهذا خيار جيد. استخدمها مع CLOCK_MONOTONIC إذا كنت تقيس فترات زمنية ، و CLOCK_REALTIME للحصول على الوقت الفعلي من اليوم.

CLOCK_REALTIME gives you the actual time of day, but is affected by adjustments to the system time -- so if the system time is adjusted while your program runs that will mess up measurements of intervals using it.

CLOCK_MONOTONIC doesn't give you the correct time of day, but it does count at the same rate and is immune to changes to the system time -- so it's ideal for measuring intervals, but useless when correct time of day is needed for display or for timestamps.

3
وأضاف

أعتقد أن الساعة() تحسب إجمالي استخدام وحدة المعالجة المركزية بين جميع المواضيع ، كان لي هذه المشكلة أيضا ...

اختيار طريقة توقيت ساعة الحائط هو تفضيل شخصي. أستخدم دالة مجمّع داخلي لأخذ طوابع زمنية (خذ فارق طابعين زمنيين إلى وقت معالجتك). لقد استخدمت نقطة عائمة للراحة (الوحدات في ثوان ، لا داعي للقلق بشأن تجاوز عدد صحيح). مع تعدد الخيوط ، هناك الكثير من الأحداث غير المتزامنة التي في رأيي لا معنى لوقت أقل من 1 ميكروثانية. وقد عمل هذا جيد جدا بالنسبة لي حتى الآن :)

مهما كان اختيارك ، فإن الالتفاف هو أسهل طريقة للتجربة

inline double my_clock(void) {
  struct timeval t;
  gettimeofday(&t, NULL);
  return (1.0e-6*t.tv_usec + t.tv_sec);
}

الاستعمال:

double start_time, end_time;
start_time = my_clock();
//some multi-threaded processing
end_time = my_clock();
printf("time is %lf\n", end_time-start_time);
1
وأضاف