Подтвердить что ты не робот

Почему Java-сериализация медленнее, чем сторонние API-интерфейсы?

Во время работы над сокетами и сериализации объектов над ними я заметил, что для ускорения сериализации объектов на Java существуют некоторые сторонние библиотеки, такие как Kryo и FST. До сих пор я ожидал, что сериализация Java оптимизирована и самая быстрая. Потому что он зависит от языка и дает решение на низком уровне, которое, как ожидается, будет быстрее. Однако рассмотренные библиотеки утверждают, что они быстрее, чем Java.

Может кто-нибудь объяснить, почему Java не может обеспечить быстрое решение для сериализации? Ради чего он отказывается от лучшей производительности?

Спасибо заранее.

4b9b3361

Ответ 1

Существует несколько причин (я являюсь автором http://code.google.com/p/fast-serialization/)

Причины:

  • обход иерархии классов для каждого объекта, выполняющего несколько вызовов для чтения/записи объекта на объект в случае.
  • Частично плохое кодирование (улучшено с 1.7)
  • Некоторые часто используемые классы используют старые медленные + устаревшие функции сериализации, такие как putfield/getfield и т.д.
  • Слишком много временных распределений объектов
  • Много проверок (версии, реализованные интерфейсы)
  • медленные потоки ввода/вывода Java
  • Отражение для установки/получения значений поля.
  • использование коллекций JDK, требующих "больших чисел", таких как Integer или Long вместо примитивов. В реализации
  • отсутствуют определенные алгоритмические оптимизации: -)
  • примитивы переупорядочиваются в сетевой порядок байтов (в java-коде, а не native) на x86.

Чтобы повысить производительность, им пришлось отказаться от поддержки старых схем управления версиями (например, способ, которым в настоящее время работает read/writeObject, является субоптимальным) и сделать некоторые вещи, такие как поддержка версий, необязательными или выбрать более чувствительные к производительности подходы к что (возможно). Кроме того, HotSpot может добавить некоторые встроенные функции для улучшения обработки примитивов с низким уровнем. Нужно иметь представление о производительности при разработке API, что, вероятно, не относится к сериализации JDK.

Ответ 2

Сериализация Java медленная, потому что она использует отражение. Сериализация JDK делает много обратной проверки совместимости и строгой проверки типов. Но сериализация java гранулировала на 100% тот же объект после десериализации в большинстве случаев.