2016-04-13 10 views
0

kryoライブラリを使用して、オブジェクトのシリアライゼーションのパフォーマンスを向上させようとしています。java kryo 3.0.3オブジェクトのシリアライズ速度が遅い

私は、私はこの方法でそれをserilizingてる次のクラスに

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(); 
     } 
    } 
} 

を持っている私は、単一インスタンスのシリアライズ

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(); 
     } 
    } 
} 

が、標準的なJavaのSerializableを使用して、同じオブジェクトをシリアライズを作ってるんだ注意してくださいインターフェイスはより速く動作します。 たとえば、コンストラクタkryoのシリアル化オブジェクトに1000000を渡した場合、188 msになります。Serializableは、正確に同じオブジェクトを136 msにシリアル化します。

私は間違っているのです(私の曲のダブステップですか、笑)?これらの方法によって作成されserializaed 1000000のサイズを有するアレイの

EDIT

シリアル化は、適切

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(); 
} 

139ミリ秒を要します。

+0

毎回新しいインスタンスを作成するのではなく、 'Kryo'インスタンスを再利用しようとしましたか?あなたは各オブジェクトの代わりに配列全体を書き込むようにKryoに伝えましたか? –

+0

@DarthAndroid私はCustomClassの1つのインスタンスをシリアル化していますが、kryoでint []配列を書き込もうとしましたが、もう一度perfomanceが低くなります –

+0

@DarthAndroidこのインスタンスには文字列と1000000 –

答えて

0

最初に、ベンチマークコード全体が利用可能でない場合、ベンチマークをコメントするのは難しいです。さらなる分析が必要な場合は、それを共有してください。それでも、オブジェクトの作成(new CustomObject)をベンチマークから外して、それがすでにそうでない場合は助言をしています(一般に、私はCustomObjectのデータを作成してクラスに渡します)。

長さ1000000のint[]であなたのCustomClassをテストするために、私にadopted Kryo's SerializationBenchmarkTestをこの問題を再現することができるようにする(このベンチマーク対策のシリアライズとデシリアライズを組み合わせることに注意してください、これはまた、別々に測定することができます)。

連結結果は最高のJavaのシリアライズの実行のために(詳細はコミット言及を確認してください)以下を示しています。最高のkryoのシリアル化のために

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

は、それが示して実行されます。

>>> 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 

として、それはUnsafeベースのシリアライゼーションは、ここでトリックを行うようだと思われるので、の代わりにKryoのUnsafeOutputを試してみてください。

関連する問題