سؤال

لدي القياس تطبيق اختبار الأداء من بعض واجهات برمجة التطبيقات التي كنت قد كتبت.في هذا القياس التطبيق ، وأنا أساسا باستخدام QueryPerformanceCounter والحصول على توقيت بقسمة الفرق من QPC القيم بعد و قبل أن يدعو إلى API ، من التردد.ولكن القياس ويبدو أن النتائج تختلف إذا كنت تشغيل التطبيق (نفس الملف التنفيذي يعمل على نفس المجموعة من Dlls) من محركات مختلفة.أيضا على محرك أقراص معين, تشغيل التطبيق للمرة 1, إغلاق التطبيق وإعادة تشغيله مرة أخرى تنتج مختلفة قياس النتائج.أي شخص يمكن أن تفسر هذا السلوك ؟ أنا في عداد المفقودين شيئا ؟

المزيد من المعلومات المفيدة:

سلوك مثل هذا:تشغيل التطبيق ، وهي إعادة تشغيل مرة أخرى ، قياس النتائج يبدو أن تتحسن على المدى 2 و بعد ذلك لا يزال نفسه.هذا السلوك أكثر وضوحا في حالة تشغيل من محرك الأقراص C.كما أود أن أذكر أن بلدي المعيار التطبيق لديه خيار إعادة تشغيل/إعادة اختبار معين API دون الحاجة لإغلاق التطبيق.أنا أفهم أن هناك jitting المشاركة, ولكن ما لا أفهمه هو أن على 1 تشغيل التطبيق ، عندما ش أعد تشغيل API عدة مرات دون إغلاق التطبيق ، وأداء تستقر بعد بضعة أشواط ، ثم عند إغلاق ثم أعد نفس اختبار الأداء يبدو إلى تحسين.

أيضا, كيف يمكنك حساب الأداء تغيير عند تشغيل مختلفة من محركات الأقراص ؟

[تحديث المعلومات]

فعلت ngen والآن الفارق في الأداء بين مختلف يمتد من نفس الموقع هو ذهب.أيإذا قمت بفتح المعيار التطبيق, تشغيله مرة واحدة ، وهي إعادة تشغيل من نفس الموقع ، فإنه يدل على نفس القيم.

لكنني واجهت مشكلة أخرى الآن.عندما كنت إطلاق التطبيق من الأقراص D وتشغيله عدة مرات (بعض التكرار من واجهات برمجة التطبيقات في نفس إطلاق المؤشر prog) ، ثم من 3 التكرار فصاعدا ، أداء جميع واجهات برمجة التطبيقات يبدو أن تنخفض بنسبة 20%.ثم إذا قمت بإغلاق وإعادة إطلاق التطبيق وتشغيله ، 2 التكرار ، فإنه يعطي القيم الصحيحة (نفس القيمة التي تم الحصول عليها من ج) ، ثم مرة أخرى أداء تقع أبعد من ذلك.هذا السلوك لا ينظر عند تشغيله من محرك الأقراص C.من محرك الأقراص C ، بغض النظر عن كيفية العديد من يدير كنت تأخذ ، وهو يتفق إلى حد ما.

أنا باستخدام مزدوج كبير المصفوفات لاختبار بلدي API الأداء.كنت قلقا من أن GC سيبدأ في المنتصف الاختبارات حتى انا اتصل GC.جمع() & GC.WaitForPendingFinalizers() explictly قبل و بعد كل اختبار.لذلك أنا لا أعتقد أن لديه أي شيء للقيام مع GC.

حاولت استخدام AQ وقت لمعرفة ما يحدث من 3 التكرار فصاعدا ، ولكن الشيء المضحك هو أنه عندما أقوم بتشغيل التطبيق مع AQ الوقت التنميط ذلك أداء لا تقع على الإطلاق.

عداد الأداء كما لا تشير إلى أي مضحك IO النشاط.

شكرا Niranjan

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

المحلول

أعتقد أن هناك مجموعة من الآثار هنا:

أولا: يعمل نفس وظيفة في اختبار تسخير عدة مرات مع نفس البيانات في كل مرة ، من المرجح أن تحسين بسبب:

  • جيت تجميع تحسين التعليمات البرمجية التي يتم تشغيلها في معظم الأحيان إلى تحسين الأداء (كما ذكر بالفعل كوري فوي)
  • رمز البرنامج سوف يكون في قرص ذاكرة التخزين المؤقت (كما ذكر بالفعل قبل Crashwork)
  • بعض رمز البرنامج سوف يكون في وحدة المعالجة المركزية ذاكرة التخزين المؤقت إذا كان صغيرا بما فيه الكفاية وأعدم في كثير من الأحيان بما فيه الكفاية

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

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

نصائح أخرى

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

وبالطبع قرص واحد قد يكون أسرع من الآخر.

نعم.هذا يسمى فقط في الوقت المناسب تجميع.أساسا نشر التطبيق كما MSIL (Microsoft Intermediate Language) و أول مرة يتم تشغيله فإنه يحصل على تحويلها إلى التعليمات البرمجية الأصلية.

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

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

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

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