2016-07-10 12 views
0

Ich bin neugierig, wie viele CPU-Zyklus oder Zeit dauert es, ein Objekt der Klasse zu erstellen, die kein Feld in Java hat? Ich diskutierte mit Kollegen darüber, ob es eine gute Idee wäre, ein neues Objekt zu schaffen, um etwas neu zu beschreiben oder Uuid zu erschaffen. Zu seiner Verteidigung sagte er, dass das Erstellen von Objekten in Java heutzutage sehr leicht ist.Wie viele CPU-Zyklen dauert eine Objekterstellung in Java?

Aber Frage ist, wie kann es mit etwas völlig anderem wie UUID Generation vergleichen?

Daher die Zweifel, wie viel CPU-Zyklen dauert es, um Objekt zuzuordnen & Was sind die genauen Schritte beteiligt?

+0

Es dauert weniger als 10 ns. Eine UUID dauert viel, viel länger. –

+0

Die meisten Kosten der Objekterstellung decken nicht die Kosten der Speicherbereinigung zum späteren Wiederherstellen von Speicher oder die Erweiterung der Größe der resultierenden Speichergröße ab, um die Speicherbereinigung durchführbar zu machen, die in der Gesamtressource enthalten sein kann oder nicht Verbrauch, für den Sie tatsächlich berechnet oder interessiert sind. Aber auf jeden Fall werden die meisten UUID-Routinen am Ende ein Objekt erzeugen, das zu Ihnen zurückkehrt und die UUID enthält, so dass die UUID-Lösung nicht billiger sein kann, egal was die Kosten der Objekterstellung sind. – mcdowella

+0

@PeterLawrey, danke für die Zeit; aber würde gerne verstehen, wie viele Schritte es dauert. Und das würde für Millionen Anfragen pro Sekunde passieren. – Shashank

Antwort

7

Die Objekterstellung in Java kann von null bis Milliarden Zyklen dauern.

  • Zero: wenn ein Objekt nicht einem lokalen Bereich, JIT-Compiler nicht entweichen kann eine Zuordnung mit lokalen Variablen als Ergebnis der Verteilung Beseitigung Optimierung ersetzen.
  • Milliarden, weil jede Zuordnung möglicherweise (potenziell lange) Garbage Collection auslösen.

habe ich bereits einen High-Level-Überblick über die Zuordnung in HotSpot JVM in this und this Antwort gegeben.

Der gebräuchlichste Weg, um ein Objekt in TLAB umfasst die folgenden Schritte zuzuzuteilen:

  1. Last tlab_top Zeiger (es ist in der Regel ein Register zum Gewinde einheimische auf x64 dedizierte CPU).
  2. Inkrementieren Sie es um die Größe eines Objekts.
  3. Vergleichen Sie tlab_top + object_size gegen tlab_end. Wechseln Sie bei Bedarf zum langsamen Pfad.
  4. Speichern Sie den neuen Wert tlab_top. Der vorherige Wert ist die Adresse des neu erstellten Objekts.
  5. Legen Sie die Standardkopfzeile des Objekts fest.
  6. Legen Sie das Feld klass fest - den Zeiger auf die Klassenmetadaten des Objekts.
  7. Initialisieren Sie die Restobjektdaten mit Nullen. Selbst ein Objekt ohne Felder kann eine Ausrichtungsauffüllung haben.

Dies alles ist über 10-15 CPU-Anweisungen.

Messen wir die durchschnittliche Zeit einer Objekterstellung mit JMH Benchmark.

package bench; 

import org.openjdk.jmh.annotations.Benchmark; 

public class Alloc { 

    @Benchmark 
    public Object baseline() { 
     return "Some preallocated object"; 
    } 

    @Benchmark 
    public Object newObject() { 
     return new Object(); 
    } 
} 

Ergebnisse:

Benchmark  Mode Cnt Score Error Units 
Alloc.baseline avgt 10 3,428 ± 0,089 ns/op 
Alloc.newObject avgt 10 4,505 ± 0,056 ns/op 

die Objektzuordnung So, zusammen mit Benchmarking-Overhead nimmt ~ 4,5 ns oder etwa 11 Zyklen auf einem 2,4-GHz-CPU. Im Vergleich zu UUID-Generierungsalgorithmen ist das tatsächlich günstig.