سؤال

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

أتذكر بوضوح رؤية تصحيح Linux kernel الذي سيسمح لي بتوقيت عملياتي بدقة النانو ثانية، باستثناء أنني نسيت وضع إشارة مرجعية عليه ونسيت اسم التصحيح أيضًا :(.

أتذكر كيف يعمل بالرغم من ذلك:

في كل تبديل سياق، سيتم قراءة قيمة ساعة عالية الدقة، وإضافة دلتا القيمتين الأخيرتين إلى وقت المعالجة للعملية الجارية.وينتج عن ذلك عرضًا دقيقًا عالي الدقة لوقت العملية الفعلي.

يتم الاحتفاظ بوقت العملية المنتظم باستخدام الساعة العادية، والتي أعتقد أنها دقيقة بالمللي ثانية (1000 هرتز)، وهي كبيرة جدًا بالنسبة لأغراضي.

هل يعرف أحد ما هو تصحيح النواة الذي أتحدث عنه؟وأتذكر أيضًا أنها كانت مثل كلمة بها حرف قبلها أو بعدها - شيء مثل "rtimer" أو شيء من هذا القبيل، لكنني لا أتذكر بالضبط.

(نرحب بالاقتراحات الأخرى أيضًا)


إن برنامج Completely Fair Scholer الذي اقترحه ماركو ليس هو ما كنت أبحث عنه، ولكنه يبدو واعدًا.المشكلة التي أواجهها هي أن الاستدعاءات التي يمكنني استخدامها للحصول على وقت العملية لا تزال لا تُرجع قيمًا دقيقة بدرجة كافية.

  • تقوم times() بإرجاع القيم 21، 22 بالمللي ثانية.
  • تقوم Clock() بإرجاع القيم 21000، 22000، بنفس الدقة.
  • تقوم الدالة getrusage() بإرجاع قيم مثل 210002 و22001 (وبعضها)، ويبدو أنها تتمتع بدقة أفضل قليلاً ولكن القيم تبدو متماثلة بشكل واضح.

لذا فإن المشكلة التي أواجهها الآن على الأرجح هي أن النواة تحتوي على المعلومات التي أحتاجها، لكنني لا أعرف استدعاء النظام الذي سيعيدها.

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

المحلول

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

http://icl.cs.utk.edu/papi/

نصائح أخرى

يرى هذا السؤال لمزيد من المعلومات.

الشيء الذي استخدمته لمثل هذه الأشياء هو gettimeofday().يوفر هيكلًا بالثواني والميكروثانية.اتصل به قبل الرمز، ثم مرة أخرى بعده.ثم قم فقط بطرح البنيتين باستخدام timersub، ويمكنك الحصول على الوقت المستغرق بالثواني من الحقل tv_usec.

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

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

أعتقد مركبات الكربون الكلورية فلورية (جدولة عادلة تماما) هو ما تبحث عنه.

يمكنك استخدام مؤقت الأحداث عالي الدقة (HPET) إذا كان لديك نواة 2.6 حديثة إلى حد ما.الدفع التوثيق/hpet.txt حول كيفية استخدامه.يعتمد هذا الحل على النظام الأساسي وأعتقد أنه متاح فقط على أنظمة x86 الأحدث.يحتوي HPET على مؤقت بسرعة 10 ميجاهرتز على الأقل، لذا يجب أن يناسب متطلباتك بسهولة.

أعتقد أن العديد من تطبيقات PowerPC من Freescale تدعم عداد التعليمات الدقيق للدورة أيضًا.لقد استخدمت هذا منذ عدة سنوات لتكوين كود محسّن للغاية ولكن لا أستطيع تذكر اسمه.أعتقد أن Freescale يحتوي على تصحيح kernel يجب عليك تطبيقه للوصول إليه من مساحة المستخدم.

http://allmybrain.com/2008/06/10/timing-cc-code-on-linux/

قد يكون مفيدًا لك (مباشرة إذا كنت تفعل ذلك في C/C++، ولكن آمل أن يعطيك مؤشرات حتى لو لم تكن كذلك)...تدعي أنها توفر دقة ميكروثانية، والتي تتجاوز المعيار الخاص بك فقط.:)

أعتقد أنني وجدت تصحيح النواة الذي كنت أبحث عنه.أنشره هنا حتى لا أنسى الرابط:

http://user.it.uu.se/~mikpe/linux/perfctr/ http://sourceforge.net/projects/perfctr/

يحرر:إنه يعمل لأغراضي، على الرغم من أنه ليس سهل الاستخدام للغاية.

حاول وحدة المعالجة المركزية عداد الطابع الزمني؟يبدو أن ويكيبيديا تقترح استخدام Clock_gettime().

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