Крио против Джексона

Я проверяю сериализацию Java, Kryo и Jackson.

Я создал крошечный код, который сериализует случайные объекты N раз. Я измеряю время сериализации и десериализации и размер объекта.

Я не очень доволен размером Kryo и Jackson, я читал о тестах, и люди видели большую разницу между Kryo и Jackson, но у меня в Kryo на 5-10% меньше. Я не знаю, пропустил ли я что-то в своем коде.

Это мой код для Kryo:

public static byte[] writeAsBytes(final Object oObject) {

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        Output output = new Output(bos);
        kryo2.register(Event.class, 0);
        kryo2.writeClassAndObject(output, oObject);
        output.close();
        return bos.toByteArray();
    }


    public static <T> T read(final byte[] aObject, final Class<T> clazz) {
        T oObject;
        ByteArrayInputStream is = new ByteArrayInputStream(aObject);
        Input input = new Input(is);
        kryo2.register(clazz, 0);
        oObject = (T) kryo2.readClassAndObject(input);
        input.close();

        return oObject;
    }

Я попытался зарегистрировать объекты и без регистрации, я получил тот же размер, и время было аналогичным.

Как я могу улучшить размер с помощью Kryo?? Размер и время я получил:

Size java:5245
Size jackson:5076
Size kryo:4790
14/09/22 12:18:05 INFO util.TimerUtil: DesSerializar Jackson:25135ms,Counter:10001
14/09/22 12:18:05 INFO util.TimerUtil: DesSerializar Java:2637ms,Counter:10001
14/09/22 12:18:05 INFO util.TimerUtil: DesSerializar Kryo:396ms,Counter:10001
14/09/22 12:18:05 INFO util.TimerUtil: Serializar Jackson:985ms,Counter:10001
14/09/22 12:18:05 INFO util.TimerUtil: Serializar Java:1171ms,Counter:10001
14/09/22 12:18:05 INFO util.TimerUtil: Serializar Kryo:397ms,Counter:10001

Я много раз выполняю код, и меня удивляет время десериализации для Джексона, 25000 мс ???


person Guille    schedule 22.09.2014    source источник
comment
Пожалуйста, включите определение класса: ваш вопрос бессмысленен, если вы не знаете, с какими объектами вы имеете дело. Например: если большая часть данных состоит только из Strings, различия в размере (и производительности) должны быть небольшими. А для других типов данных, таких как числа с плавающей запятой, различия могут складываться. А для оценки производительности вам действительно следует взглянуть на такой инструмент, как jmh, чтобы получить надежные цифры. Что касается десериализации Джексона, сам тестовый код должен не только выполнять прогрев (что может делать jmh), но и обеспечивать постоянное повторное использование ObjectMapper экземпляров.   -  person StaxMan    schedule 25.09.2014
comment
если у вас есть какие-то строки в объекте, это не будет иметь большого значения, но kryo имеет некоторую поддержку сжатия. почему ты интересуешься медленным Джексоном? он сериализуется в json, текстовая сериализация всегда будет намного медленнее, чем двоичная.   -  person MarianP    schedule 31.03.2015
comment
@MarianP зависит от определения намного медленнее; обычно скорость будет сходиться к разнице в закодированном размере; это означает, что двоичные форматы могут быть в два раза быстрее. Но различия в реализации означают, что вариации высоки.   -  person StaxMan    schedule 16.09.2015


Ответы (1)


Попробуйте использовать kryo.readObject(arg0, arg1) вместо kryo.readClassAndObject(input);, это более эффективно сериализует объекты в Java.

person Capril Aprilovich    schedule 18.08.2015
comment
Мне любопытно, как это получилось. Может быть, я попробую. - person djangofan; 01.07.2019