سؤال

الآن أنا أحمل ملف ثم استخدام GetTimeOfday وتتبع وقت وحدة المعالجة المركزية مع TV_USEC

تختلف نتائجي، أحصل على 250 إلى 280 ثانية ولكن في بعض الأحيان 300 أو 500. كتبت Usleep والنوم (0) و (1) دون نجاح. الوقت لا يزال يختلف بشكل كبير. اعتقدت أن النوم (1) (ثانية في لينكس، وليس نوم ويندوز في MS) قد حلها. كيف يمكنني تتبع الوقت بطريقة أكثر اتساقا لاختبار؟ ربما يجب أن أنتظر حتى يكون لدي بيانات اختبار أكبر بكثير وأكثر تعقيدا رمز قبل بدء القياسات؟

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

المحلول

والواجهة الموصى بها حاليا لفترة عالية REZ على Linux (وبوسيكس بشكل عام) هي ساعة charch_gettime. انظر صفحة الرجل.


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

ولكن اقرأ صفحة الرجل. لاحظ أنك تحتاج إلى الارتباط مع LRT، لأن بوسيكس يقول ذلك، أعتقد. ربما لتجنب تعارض الرمز في -LC، بالنسبة للبرامج القديمة التي حددت الساعة الخاصة بهم؟ لكن الدين الديناميكي تستخدم الرموز الضعيفة ...

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

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

إذا كان لديك جهاز متعدد النواة ومعيار واحد خيوط للرمز الذي تقوم بتحسينه، فيمكنك إعطائه أولوية في الوقت الفعلي مثبتا على أحد النظارات الخاصة بك. تأكد من اختيار Core الذي لا يتعامل مع المقاطعات، أو سيتم إغلاق لوحة المفاتيح (وكل شيء آخر) حتى يتم ذلك. استخدم Stramset (للضبط إلى وحدة المعالجة المركزية واحدة) و Chrt (لتحديد Hourtime Prio). انظر هذا البريد الذي أرسلته إلى GMP-Devel مع هذه الخدعة:http://gmplib.org/list-archives/gmp-devel/2008-march/000789.html.

أوه نعم، للحصول على أقصى توقيت دقيق، يمكنك استخدام RDTSC بنفسك (على X86 / AMD64). إذا لم يكن لديك أي syscalls الأخرى في ما تقضيه، فهذا ليس فكرة سيئة. الاستيلاء على إطار معيار لوضع وظيفتك في. GMP لديه واحد لائق جدا. ربما لم يتم إعدادها بشكل جيد في وظائف القياس التي لا تعمل في GMP وتسمى MPN_Whatever. لا أتذكر، ويستحق نظرة.

نصائح أخرى

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

بعد قول ذلك، لست متأكدا تماما ما تستخدمه للنوم () ل. يمكنك نشر مثال على ما تنوي القيام به؟

أود أن أوصي بوضع هذا الرمز في حلقة. تشغيله أكثر من 1000 أو 10000 التكرارات. هناك مشاكل مع هذا إذا كنت تفعل فقط بعض التعليمات، ولكن يجب أن تساعد.

مجموعات بيانات أكبر تساعد أيضا بالطبع.

النوم هو الذهاب إلى deschedule الخيط الخاص بك من وحدة المعالجة المركزية. لا يحسب الوقت بدقة مع الدقة.

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