2016-04-13 4 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 его с помощью этого метода, обратите внимание, что я делаю сериализации из одного экземпляра

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 интерфейс работает быстрее. Например, когда я передаю 1000000 как второй параметр для конструктора kryo сериализует объект в 188 мс, когда Serializable сериализует точно такой же объект в 136 мс.

Так что я делаю неправильно (это дабстеп в моей песне, LOL)?

РЕДАКТИРОВАТЬ

Сериализация массива с размером 1000000, созданной и 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 вместо того, чтобы создавать новый каждый раз? Вы пытались рассказать Крио написать весь массив вместо каждого объекта? –

+0

@DarthAndroid Я сериализую один экземпляр CustomClass, я попытался написать массив int [] by kryo, но, опять же, производительность низкая –

+0

@DarthAndroid этот экземпляр содержит String и массив из int с размером 1000000 –

ответ

0

Сначала сложно комментировать контрольный показатель, если не доступен весь эталонный код. Пожалуйста, поделитесь им, если потребуется дополнительный анализ. Тем не менее, я уже советовал вытащить создание объекта (new CustomObject) из теста, если это еще не так (и вообще я создаю данные CustomObject снаружи и передам их в класс).

Чтобы иметь возможность воспроизвести этот вопрос я adopted Kryo's SerializationBenchmarkTest, чтобы проверить ваш CustomClass с int[] длиной 1000000 (обратите внимание, что это эталонные меры сериализации и десериализации в сочетании, это также может быть измерена отдельно).

Сводный результат показывает следующее (проверить упомянутое обязательство для более подробной информации) для лучших трасс сериализации:

>>> 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's UnsafeOutput вместо Output.

Смежные вопросы