Порівнюємо Java- бібліотеки для роботи з JSON: JSON.simple, GSON, Jackson і JSONP


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

JSON на сьогодні – загальноприйнятий стандарт обміну даними між сервером і веб-застосуванням, і, що часто буває з багатьма стандартами, ми можемо прийняти його як дане, не поглиблюючись в принципи його роботи. Частенько ми не замислюємося про те, які бібліотеки використовуємо для роботи з JSON, хоча, безумовно, між ними є різниця. Взявши це до уваги, ми провели ряд тестів з метою дізнатися, наскільки швидко кожна з чотирьох найпопулярніших бібліотек для роботи з JSON справляється з розбором різних за розміром файлів. Тепер ми готові поділитися з вами отриманими результатами.

Часто JSON використовується для передачі і розбору великих файлів. Цей сценарій поширений в додатках для обробки даних, запущених на кластерах Hadoop або Spark. Залежно від розміру файлу можна спостерігати значну різницю в швидкості роботи конкретної бібліотеки. Невеликі файли можуть приходити увесь час в ролі запитів, їх розбір відбувається швидко, тому різниця в швидкості на перший погляд не грає великої ролі, але чим більше файлів вам потрібно обробити, тим більше ця різниця. Мікросервіси і розподілені застосування використовують JSON для передачі такого виду файлів, оскільки це стандарт де-факто для веб API.

Не усі JSON- бібліотеки однакові – вибір підходить під ваше завдання може бути критичний. Тести продуктивності, приведені в цій статті, допоможуть вам вибрати правильну бібліотеку.

Бібліотеки для роботи з JSON

Для своїх тестів ми вибрали чотири бібліотеки – JSON.simple, GSON, Jackson, JSONP – виходячи з їх популярності на Github, саме вони найчастіше використовуються в проектах на Java.

  • JSON.simple від Yidong Fang. Невелика і легковага бібліотека для кодування і декодування JSON, незважаючи на свою простоту, виконує свою роботу на високому рівні.
  • GSON от Google. Библиотека, которая умеет конвертировать Java объекты в JSON и наоборот. Не требует специальным образом аннотировать классы, а также в качестве бонуса имеет полную поддержку Java Generics. Отсутствие необходимости добавления аннотаций упрощает реализацию и даже может быть главным требованием, если вы собираетесь сериализовывать объекты, не имея для них исходного кода.
  • Jackson від FasterXML. Набір інструментів для обробки даних, грунтований на потоковому JSON- парсере і генераторі. Призначена для Java бібліотека уміє працювати не лише з JSON. Має найпопулярніший JSON- парсер (виходячи із статистики використання на GitHub).
  • JSONP від Oracle. API для роботи з JSON, а саме для генерації і розбору потокових JSON- текстів. Еталонна реалізація JSR353 з відкритим початковим кодом.

Тестування продуктивності

Ми провели тести продуктивності на різних за розміром файлах. Вимоги (тобто і продуктивність) до обробки різних за розміром файлів відрізняються, тоді як виникає нове оточення, в якому нам треба обробляти ці файли.

Були перевірені два ключові сценарії – розбір великих (190 Мб) і маленьких (1 Кб) файлів. Великий JSON- файл був узятий звідси, маленькі були згенеровані випадковим чином з допомогою http://www.json-generator.com/.

У обох випадках був виконаний прогін кожного файлу 10 разів. Для великих файлів в кожному прогоні було 10 ітерацій, для маленьких – 10000. Ми не залишали маленькі файли в пам’яті між ітераціями. Усі тести були запущені на c3.large в хмарі AWS.

Результат для великих файлів показаний в таблиці нижче, для маленьких в цілях економії місця будуть тільки усереднені результати. Детальні результати можна подивитися тут. Увесь початковий код доступний тут.

Великі файли

Тут ми спостерігаємо велику різницю в результатах. Залежно від прогону, Jackson або JSON.simple показують найкращу швидкість роботи, в сумі по усіх тестах Jackson все ж виривається вперед. В середньому по усіх тестах, найкращу швидкість роботи з великими файлами показують Jackson і JSON.simple, далеко позаду них йде JSONP на третьому місці і GSON на четвертому.

Поглянемо на результати під іншим кутом – в процентному співвідношенні:

Це схоже на фото-фініш – Jackson виходить з цієї гонки переможцем, йому в потилицю дихає JSON.simple. Дві інші бібліотеки ледве помітно маячать в дзеркалі заднього виду.

Маленькі файли

У таблиці вище представлені середні результати для 10 прогонів по кожному файлу, і середнє по усіх файлах внизу таблиці. Кількість файлів, для яких кожна з бібліотек відпрацювала найшвидше :

  • GSON – 14
  • JSONP – 5
  • Jackson – 1
  • JSON.simple – 0

Цифри говорять самі за себе. У будь-якому випадку, якщо розглядати середні результати по усіх тестах для маленьких файлів, переможцем виходить GSON, JSON.simple і JSONP займають друге і третє місце відповідно, Jackson на останньому місці. Отже, попри те, що JSON.simple не був найшвидшим ні на одному з тестових файлів, в середньому він виходить на друге місце. Аналогічно, хоча JSONP усіх швидше впорався з багатьма файлами, у результаті він займає третє місце.

Треба помітити те, що хоча Jackson в даному випадку – найповільніша бібліотека, він показує схожі результати на кожному файлі, тоді як інші бібліотеки у більшості випадків демонструють багато велику швидкість роботи, але на деяких файлах швидкість їх роботи порівнянна з Jackson, або навіть трохи нижче.

Тепер поглянемо на результати в процентному співвідношенні:

GSON виграє гонку на маленьких файлах, JSON.simple знову показує другий результат, трохи відстаючи від переможця, JSONP займає явне третє місце, і, нарешті, Jackson замикає гонку.

Висновок

Швидкість розбору – не єдиний критерій при виборі бібліотеки для роботи з JSON, але один з найважливіших. Виконавши описані в статті тести продуктивності, ми виявили, що не існує бібліотеки, яка б працювала краще за інших на файлах усіх розмірів. Бібліотеки, які добре показали себе на великих файлах, провалювалися на маленьких і навпаки.

Таким чином, вибір бібліотеки виходячи зі швидкості роботи залежить від конкретного випадку:

  • якщо вам часто доводиться працювати з великими JSON- файлами, то бібліотекою, що цікавить вас, буде Jackson. GSON зазнає найбільші утруднення при роботі з великими файлами.
  • якщо вам доводиться мати справу з великою кількістю коротких JSON- запитів (як це часто відбувається в сервісах і розподілених застосуваннях), вибирайте GSON. Jackson справляється з великою кількістю маленьких файлів найгірше.
  • якщо вам необхідно працювати як з великими, так і з маленькими файлами, JSON.simple вам в допомогу: за результатами тестів він займає друге місце для обох типів файлів. Ні Jackson, ні GSON не можуть з належною швидкістю працювати одночасно з різними за розміром файлами.

Коли справа стосується швидкості, JSONP навряд чи можна порекомендувати для якого-небудь випадку – він працює повільно (в порівнянні з іншими доступними бібліотеками) як з великими, так і з маленькими файлами. На щастя, в Java 9 обіцяють вбудувати підтримку JSON, яка повинна стати поліпшенням поточної еталонної реалізації JSR353 в особі JSONP.

На цьому все. Ще раз коротко: якщо вам важлива швидкість розбору файлів JSON- бібліотекою, вибирайте Jackson для великих за розміром файлів, GSON – для маленьких і JSON.simple для одночасної роботи з файлами обох типів.

Переклад статті “The Ultimate JSON Library: JSON.simple vs GSON vs Jackson vs JSON”

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *