سؤال

لا أحد من أي وقت مضى استخدام ساعة توقيت القياس ، أو أن الأداء أداة دائما استخدامها ؟ هل هناك أي خير الأدوات جافا ؟ ما هي الأدوات التي تستخدمها ؟

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

كيف يمكنك معالجة نظام التشغيل الجدولة عند القياس?

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

المحلول

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

لهذا ، أستخدم مجموعة صغيرة من الأساليب الثابتة التي قمت ببنائها منذ وقت طويل ، والتي تستند إلى System.currentTimeMillis().

لعمل التنميط الذي استخدمته Jprofiler لعدة سنوات ووجدت أنها جيدة جدًا. لقد نظرت مؤخرًا YouRkit, ، والذي يبدو رائعًا من الموقع ، لكنني لم أستخدمه على الإطلاق ، شخصيًا.

للإجابة على السؤال حول جدولة الانقطاعات ، أجد أن القيام بتشغيل متكرر حتى يتم تحقيق التناسق/يتم ملاحظته في الممارسة للتخلص من النتائج الشاذة من جدولة العملية. أجد أيضًا أن جدولة الخيوط ليس لها أي تأثير عملي لتشغيل ما بين 5 و 30 ثانية. أخيرًا ، بعد أن تمرير جدولة عتبة ثوان قليلة ، في تجربتي ، تأثير ضئيل على النتائج - أجد أن المدى البالغ 5 ثوانٍ يتوسط باستمرار نفس المدى لمدة 5 دقائق للوقت/التكرار.

قد ترغب أيضًا في التفكير في التمهيدي في الرمز الذي تم اختباره حوالي 10،000 مرة "لتسخين" JIT ، اعتمادًا على عدد المرات التي تتوقع فيها تشغيل الرمز المختبري بمرور الوقت في الحياة الحقيقية.

نصائح أخرى

إنه صالح تمامًا طالما تقيس فترات زمنية كبيرة بما يكفي. أود تنفيذ 20-30 أشواط لما تنوي اختباره بحيث يتجاوز الوقت إجمالي الوقت 1 ثانية. لقد لاحظت أن حسابات الوقت تستند إلى System.CurrentTimeMillis () تميل إلى أن تكون إما 0ms أو ~ 30ms ؛ لا أعتقد أنه يمكنك الحصول على أي شيء أكثر دقة من ذلك. قد ترغب في تجربة System.Nanotime () إذا كنت بحاجة حقًا إلى قياس فترة زمنية صغيرة:

يمنحك Profiler معلومات أكثر تفصيلاً ، والتي يمكن أن تساعد في تشخيص مشاكل الأداء وإصلاحها.

فيما يتعلق بالقياس الفعلي ، فإن وقت التوقيت هو ما يلاحظه المستخدمون ، لذا إذا كنت ترغب في التحقق من صحة أن الأمور ضمن حدود مقبولة ، فمن الجيد أن وقت الإيقاف أمر جيد.

عندما ترغب في إصلاح المشكلات فعليًا ، يمكن أن يكون البروفيل مفيدًا حقًا.

ساعة توقيت هي في الواقع أفضل معيار!

إن نهاية استجابة المستخدم الحقيقية لإنهاء المستخدم هي الوقت الذي يهم بالفعل.

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

تعد الأدوات رائعة للاختبار الآلي ، ولتحديد المشكلة ولكن لا تغفل عن ما تريد قياسه حقًا.

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

أنا أيضا أقترح عليك استخدام System.nanoTime() كما أنها أكثر دقة.إذا كان لديك وقت الاختبار حوالي 10 مايكرو ثانية أو أقل, كنت لا تريد أن نسمي هذا في كثير من الأحيان أو أنها يمكن أن تغير النتيجة.(مثلا ، إذا أنا اختبار لمدة 5 ثواني و أريد أن أعرف عندما كنت فقط الحصول على nanoTime كل 1000 التكرار ، لو كنت أعرف التكرار هو سريع جدا)

كيف تتناول جدولة نظام التشغيل عند القياس؟

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

ليس هناك فائدة من القول ، سيكون برنامجي أسرع ، إذا لم يكن لدي نظام التشغيل.

إذا كنت تستخدم Linux, ، يمكنك استخدام أدوات مثل numactl, chrt و taskset للتحكم في كيفية استخدام وحدات المعالجة المركزية والجدولة.

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

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

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

أعتقد أن السؤال الرئيسي هو تعقيد وطول وقت العملية.

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

ومع ذلك ، فإن الأتمتة التي توفرها المكالمات إلى أي نوع من نظام الساعة على الكمبيوتر ، مثل مكالمة Java Millis المشار إليها في المقالة المرتبطة ، تتفوق بشكل واضح على رؤية المدة التي يستمر فيها شيء ما.

إن البروفيرين لطيفين ، عندما يعملون ، لكن لدي مشاكل في تطبيقها على تطبيقنا ، والتي تتضمن عادة توليد رمز ديناميكي ، وتحميل ديناميكي لـ DLL ، والعمل المنجز في لغتي البرمجة النصية المدمجة في الوقت المناسب لـ طلبي. غالبًا ما يقتصرون على افتراض لغة مصدر واحد وغيرها من التوقعات غير الواقعية للبرامج المعقدة.

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

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

لا أعتقد أن القياس المعياري لتوقيت الإيقاف أمر فظيع للغاية ، ولكن إذا تمكنت من الوصول إلى جهاز Solaris أو OS X ، فيجب عليك التحقق من Dtrace. لقد استخدمتها للحصول على بعض المعلومات الرائعة حول التوقيت في تطبيقاتي.

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

أفعل ذلك طوال الوقت. أفضل استخدام Profiler ، لكن بائع اللغة الخاصة بالمجال التي أعمل معها لا توفر واحدة.

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