Frage

Zunächst muss ich zugeben, dass dies sehr grundlegende und primitive Fragen sind ... ich möchte verschiedene Algorithmen in Java zum Sortieren und Suchen nachweisen und einen Wert für die Laufzeit erhalten. Es gibt Probleme, die ich nicht lösen kann:

  1. Es gibt Hotspot -Kompilien - eine Laufzeitoptimierung, die ich deaktivieren muss (denke ich).

  2. Wie bekomme ich Zeitwerte (Sekunden) für Laufzeiten? Ein Timer vor der Ausführung zu starten und danach zu stoppen ... scheint ein wenig primitiv zu sein. Und das Timer-Objekt selbst verbraucht die Laufzeit ... das muss ich vermeiden.

Gibt es etwas in der Java -API, die man nutzen könnte, um diese Probleme zu lösen?

Danke, Klaus

War es hilfreich?

Lösung

  1. Verwenden -Xint JVM -Flagge. Andere Optionen sind zu sehen hier.

  2. Verwenden Sie das ThreadMXBean API, um CPU/Benutzerzeiten für Ihren Thread zu erhalten. Ein Beispiel ist zu sehen hier.

Andere Tipps

Sie können Hotspot mit deaktivieren -Xint Auf der Befehlszeile, um eine Größenreduzierung der Leistungsabnahme zu erhalten. Warum möchten Sie jedoch nicht die Leistung der realen Welt messen? Verschiedene Dinge können beim Zusammenstellen zu Engpässen werden.

Im Allgemeinen für Mikrobenchmarks:

  • verwenden System.nanoTime Um zu Beginn und Ende eine Zeitmessung zu erhalten
  • für eine angemessene Zeit laufen
  • Führen Sie die Messung mehrmals durch (Es gibt einige "Aufwärmen").
  • Messungen verschiedener Algorithmen nicht einschränken
  • Machen Sie im gemessenen Segment keine I/A
  • Verwenden Sie das Ergebnis (Hotspot kann triviale Operationen vollständig optimieren)
  • Tun Sie es in einer realen Situation (oder einer Cloae wie möglich)
  • Denken Sie daran, Dual Core ist die Norm, und mehr Kerne werden normal

Verwenden von System.nanotime () verbraucht zweimal weniger als 1 Mikrosekunden. Ich schlage vor, Sie betreiben einen Benchmark für eine Reihe von Sekunden und nehmen einen Durchschnitt, sodass ein Mikrosekundenfehler nicht signifikant ist.

Insgesamt würde ich empfehlen, die Dinge nicht komplizierter zu machen, als Sie es brauchen müssen.

Um ein eingebautes Aufwärmen zu haben, ignoriere ich oft die ersten 10% -20% der Iterationen. Etwas wie

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top