2016-04-13 52 views
0

我試圖通過使用kryo庫來獲得更好的對象序列化性能。java kryo 3.0.3低對象的序列化速度

我隔壁班的

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

我用這種方法serilizing它,注意我使用標準的Java的Serializable使得單個實例

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

的序列,但序列化同一對象界面工作得更快。 例如,當我通過1000000作爲第二參數構造函數kryo序列化對象在188毫秒,當Serializable序列化完全相同的對象在136毫秒

所以我做錯了什麼(在我的歌裏,是一個dubstep,哈哈)?

EDIT

陣列的具有百萬大小,由這些方法生成和序列化serializaed適當

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的實例,我試圖通過kryo寫int []數組,但是,再次,性能低 –

+0

@DarthAndroid此實例包含字符串和大小爲1000000的整數的數組 –

回答

0

起初很難評論基準測試,如果不是整個基準測試代碼可用的話。如果需要進一步分析,請分享。儘管如此,我還是建議將對象創建(new CustomObject)從基準測試中解脫出來(並且一般情況下,我會創建外部數據CustomObject並將它傳遞給該類)。

爲了能夠重現這個問題我adopted Kryo's SerializationBenchmarkTest來測試你的CustomClass長度爲1000000的int[](請注意,這個基準措施系列化和反序列化結合起來,這也可以分別測量)。

合併結果顯示如下(檢查提到提交詳細介紹)最佳Java序列化運行:

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

爲了獲得最佳的KRYO序列化運行時,它顯示:

>>> 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而不是Output