2016-04-13 10 views
0

Ich versuche, bessere Leistung der Serialisierung des Gegenstandes unter Verwendung kryo der Bibliothek zu erhalten.java kryo 3.0.3 niedrige Serialisierungsgeschwindigkeit des Objekts

Ich habe die nächste Klasse

public class CustomClass { 

    private String name; 
    private int[] array; 


    public CustomClass(String name, int size){ 
     this.name = name; 
     fillArray(size); 
    } 

    private CustomClass(){ } 

    private void fillArray(int size){ 
     array = new int[size]; 
     Random random = new Random(); 
     for (int i = 0; i < size; i++){ 
      array[i] = random.nextInt(); 
     } 
    } 
} 

ich es mit dieser Methode bin serilizing stelle ich die Serialisierung von einzelnen Instanz mache

public void kryoWrite(Object object){ 
    Kryo kryo = new Kryo(); 
    Output output = null; 
    try { 
     output = new Output(new FileOutputStream("kryo.txt")); 
     kryo.writeObject(output, object); 
    } catch (IOException e){ 
     e.printStackTrace(); 
    } finally { 
     if (output != null) { 
      output.close(); 
     } 
    } 
} 

aber das gleiche Objekt mit Standard-Java Serialisierung Serializable Schnittstelle funktioniert schneller. Wenn beispielsweise I geben 1000000 als zweites param kryo Serialisieren Objekt in 188 ms, zur Konstrukteurs wenn Serializable in 136 ms genau das gleiche Objekt serialisiert.

Also was mache ich falsch (ist es ein Dubstep in meinem Lied, lol)?

EDIT

Serialisierung von Arrays mit einer Größe von 1000000, erstellt und serializaed durch diese Methoden in geeigneter Weise

public static int[] getArray(int size){ 
    int[] array = new int[size]; 
    Random random = new Random(); 
    for (int i = 0; i < size; i++){ 
     array[i] = random.nextInt(); 
    } 
    return array; 
} 

public static void kryoWriteArray(int[] array) throws FileNotFoundException { 
    Kryo kryo = new Kryo(); 
    Output output = new Output(new FileOutputStream("array.txt")); 
    output.writeInts(array); 
    output.close(); 
} 

dauert 139 ms.

+0

Haben Sie versucht, die 'Kryo'-Instanz erneut zu verwenden, anstatt jedes Mal eine neue zu erstellen? Hast du versucht, Kryo zu sagen, dass er das gesamte Array anstatt jedes Objekts schreiben soll? –

+0

@DarthAndroid Ich bin eine Instanz von CustomClass serialisieren, ich versuchte, Int [] Array von Kryo zu schreiben, aber wiederum ist die Leistung niedrig –

+0

@DarthAndroid diese Instanz enthält String und Array von Ints mit der Größe von 1000000 –

Antwort

0

Zunächst ist es schwierig, einen Benchmark zu kommentieren, wenn nicht der gesamte Benchmark-Code verfügbar ist. Bitte teilen Sie es, wenn weitere Analysen benötigt werden. Trotzdem rate ich bereits, die Objekterstellung (new CustomObject) aus dem Benchmark herauszunehmen, wenn das nicht bereits der Fall ist (und im Allgemeinen würde ich Daten von CustomObject außerhalb erstellen und an die Klasse weitergeben).

Um in der Lage sein, dieses Problem zu reproduzieren, mir adopted Kryo's SerializationBenchmarkTest Ihre CustomClass mit einer int[] von Länge zu testen 1000000 (bitte beachten Sie, dass diese Benchmark Maßnahmen Serialisierung und kombiniert Deserialisierung dies auch separat gemessen werden könnte).

Das Konzernergebnis zeigt die folgende (überprüfe die für weitere Einzelheiten erwähnt begehen) für die besten Java-Serialisierung läuft:

>>> Java serialization via Externalizable (best time): 870 ms 
>>> Java serialization without try-catch via Externalizable (best time): 864 ms 

Für die beste Kryo Serialisierung läuft es zeigt:

>>> Kryo serialization without try-catch (best time): 835 ms 
>>> Kryo unsafe serialization without try-catch, without ASM, without references (best time): 181 ms 
>>> Kryo serialization without try-catch with fast streams (best time): 982 ms 
>>> Kryo unmodified serialization (best time): 1,108 ms 
>>> Kryo unsafe serialization without try-catch, without ASM (best time): 191 ms 
>>> Kryo unsafe serialization without try-catch (best time): 193 ms 
>>> Kryo serialization (best time): 989 ms 

Wie Es scheint, Unsafe basierte Serialisierung scheint hier den Trick zu tun, so würde ich sagen, Sie sollten Kryos UnsafeOutput anstelle von Output versuchen.