سؤال

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

  1. هناك مجموعة Hotspot - وهو تحسين وقت التشغيل الذي أحتاجه لإلغاء تنشيط (أعتقد).

  2. كيف أحصل على قيم زمنية (ثواني) لأوقات التشغيل؟ بدء توقيت قبل التنفيذ وإيقافه بعد ذلك ... يبدو بدائي بعض الشيء. ويستهلك المؤقت نفسه نفسه وقت التشغيل ... أحتاج إلى تجنب ذلك.

هل هناك أي شيء في Java API يمكن للمرء استخدامه لحل هذه المشكلات؟

شكرا ، كلاوس

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

المحلول

  1. يستخدم -Xint علم JVM. يمكن رؤية خيارات أخرى هنا.

  2. استخدم ال ThreadMXBean API للحصول على وحدة المعالجة المركزية/أوقات المستخدم لخيطك. يمكن رؤية مثال هنا.

نصائح أخرى

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

بشكل عام للعلامات الدقيقة:

  • استعمال System.nanoTime للحصول على قياس الوقت في البداية والنهاية
  • الجري لفترة زمنية معقولة
  • هل القياس عدة مرات (هناك بعض "الاحماء")
  • لا تتداخل قياسات خوارزميات مختلفة
  • لا تفعل أي I/O في الجزء المقاس
  • استخدم النتيجة (يمكن للنقطة الساخنة تحسين العمليات التافهة تمامًا)
  • افعل ذلك في وضع العالم الحقيقي (أو cloae قدر الإمكان)
  • تذكر أن النواة المزدوجة هي القاعدة ، وسيصبح المزيد من النوى طبيعية

باستخدام System.Nanotime () يستهلك مرتين أقل من 1 ثانية صغيرة. أقترح عليك تشغيل أي معيار لعدد من الثانية وتتخذ متوسطًا حتى لا يكون خطأ ثانية صغيرة.

بشكل عام ، أود أن أقترح عدم جعل الأمور أكثر تعقيدًا مما تحتاجه.

للحصول على بني في الاحماء ، غالبًا ما أتجاهل أول 10 ٪ إلى 20 ٪ من التكرارات. شيء مثل

long start;
int count;
for(int i = -count / 5; i < count; i++) {
    if (count == 0) start = System.nanoTime();
    // do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top