كيف يمكنني العثور على وقت تنفيذ قسم من برنامجي في لغة C؟

StackOverflow https://stackoverflow.com/questions/173409

  •  05-07-2019
  •  | 
  •  

سؤال

أحاول إيجاد طريقة للحصول على وقت تنفيذ قسم من التعليمات البرمجية في لغة C.لقد قمت بالفعل بتجربة كل من time() وclock() من time.h، ولكن يبدو أن time() تُرجع الثواني ويبدو أن Clock() تعطيني ميلي ثانية (أو سنتي ثانية؟) بالرغم من ذلك أرغب في الحصول على شيء أكثر دقة.هل هناك طريقة يمكنني من خلالها الحصول على الوقت بدقة ميكروثانية على الأقل؟

هذا يحتاج فقط إلى أن يكون قادرًا على التجميع على Linux.

هل كانت مفيدة؟

المحلول

وأشرت إلى clock() وtime() - الذي كنت تبحث عنه gettimeofday()؟ والتي تملأ في struct timeval، والذي يحتوي ثواني وميكروثانية.

وبالطبع القرار الفعلي هو ما يصل إلى الأجهزة.

نصائح أخرى

لما يستحق، وهنا واحد وهذا عدد قليل من وحدات الماكرو:

#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);

وبعد ذلك فقط استخدامه مع:

main() {
  START;
  // Do stuff you want to time
  STOP;
  PRINTTIME;
}

http://ctips.pbwiki.com/Timer

وأنت تريد تطبيق التعريف .

وكلمات البحث في SO ومحركات البحث: التنميط لينكس

وإلقاء نظرة على gettimeofday ، clock_ * أو <وأ href = "HTTP: // شبكة الاتصالات العالمية .opengroup.org / onlinepubs / 009695399 / وظائف / getitimer.html "يختلط =" نوفولو noreferrer "> الحصول على / setitimer .

"bench.h" . فإنه يتيح لك وضع START_TIMER. وSTOP_TIMER ( "اسم")؛ في التعليمات البرمجية، مما يتيح لك الفائدة بشكل تعسفي أي جزء من التعليمات البرمجية (ملاحظة: يوصى فقط لأجزاء قصيرة، وليس الأشياء أخذ العشرات من ميلي ثانية أو أكثر). في دقيقة إلى دورة على مدار الساعة، وإن كان في بعض الحالات النادرة يمكن أن تتغير كيف يتم ترجمة التعليمات البرمجية في بين، في هذه الحالة كنت أفضل حالا مع التعريف (على الرغم المحللون هي أكثر عموما جهد لاستخدامها في أقسام محددة من التعليمات البرمجية).

وأنها لا تعمل إلا على إلى x86.

وقد ترغب في جوجل ل<م> الأجهزة أداة.

وأنت لن تجد مكالمة المكتبة التي تمكنك من تجاوز قرار مدار الساعة من النظام الأساسي الخاص بك. إما استخدام التعريف (رجل gprof) كما اقترح ملصق آخر، أو - سريعة وقذرة - وضع حلقة حول القسم المخالف من التعليمات البرمجية لتنفيذ ذلك مرات عديدة، واستخدام ساعة ().

وgettimeofday() يوفر لك مع قرار من ميكروثانية، في حين clock_gettime() يوفر لك مع قرار نانو ثانية.

int clock_gettime(clockid_t clk_id, struct timespec *tp);

ووclk_id يحدد على مدار الساعة لاستخدامها. استخدام CLOCK_REALTIME إذا كنت ترغب في مدار الساعة على نطاق المنظومة مرئية لجميع العمليات. استخدام CLOCK_PROCESS_CPUTIME_ID لالموقت لكل عملية وCLOCK_THREAD_CPUTIME_ID لالموقت موضوع معين.

الأمر يعتمد على الظروف..تعتبر ملفات التعريف مفيدة للمشاهدات العالمية العامة، ولكن إذا كنت تحتاج حقًا إلى عرض دقيق فإن توصيتي هي KISS.ما عليك سوى تشغيل الكود في حلقة بحيث يستغرق إكماله دقيقة أو نحو ذلك.ثم قم بحساب متوسط ​​بسيط بناءً على إجمالي وقت التشغيل والتكرارات التي تم تنفيذها.

هذا النهج يسمح لك بما يلي:

  1. احصل على نتائج دقيقة باستخدام مؤقتات ذات دقة منخفضة.

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

لا أعرف أي بيئة / OS كنت تعمل على، ولكن التوقيت الخاص بك قد تكون غير دقيقة إذا موضوع أو مهمة أو عملية أخرى يستبق كود توقيت الخاصة بك في الوسط. أقترح آليات استكشاف مثل كائنات المزامنة أو الإشارات لمنع المواضيع الأخرى من preemting العملية الخاصة بك.

إذا كنت تقوم بتطوير و x86 أو إلى x64 لماذا لا تستخدم عداد طابع الوقت: RDTSC .

وسيكون أكثر موثوقية ثم ظائف الانسي C مثل الوقت () أو ساعة () كما RDTSC هي وظيفة الذرية. باستخدام وظائف C لهذا الغرض يمكن أن يعرض مشاكل لديك أي ضمان بأن موضوع أنهم المنفذة في لن تحول بها ونتيجة لذلك فإن قيمة عودتهم لن تكون وصفا دقيقا للوقت التنفيذ الفعلي تحاول قياس .

ومع RDTSC يمكنك قياس هذا أفضل. سوف تحتاج إلى تحويل القراد عد مرة أخرى إلى الوقت H مقروء الإنسان: M: شكل S والتي سوف تعتمد على تردد المعالجات على مدار الساعة ولكن جوجل حول وأنا متأكد من أنك سوف تجد أمثلة

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top