Порівнюємо 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 ітерацій, для маленьких – 10 000. Ми не залишали маленькі файли в пам’яті між ітераціями. Всі тести були запущені на 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 адреса не оприлюднюватиметься. Обов’язкові поля позначені *