2015-04-29 2 views
0

Я должен превратить List<Map> в строку JSON. Map s являются плоскими и содержат примитивные и строковые данные. Прямо сейчас я использую GSON. В принципе, как это:JSON performance

List<Map> list = new ArrayList(); 

Map map = new HashMap(); 
map.put("id",100); 
map.put("name","Joe"); 
map.put("country","US"); 
// ... 
list.add(map); 

Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); 
Stopwatch sw = Stopwatch.createStarted(); // guava's stopwatch 
String s = gson.toJson(list); 
System.err.println("toJson laps " + sw); 
return s; 

list может иметь 100 записей и каждую карту APROX. 20 полей. GSON действительно занимает много времени, чтобы создать строку JSON. Строка JSON будет возвращена HTTP-ответом, и сейчас потребовалось слишком много времени (8000 мс). Поэтому я пробую другие: json-smart, jackson и т. Д. Но никто не дает значительного повышения скорости. Я отслеживаю создание строки JSON как горячую точку во время выполнения.

Для полей размером 100 x 20 я действительно не ожидаю больше секунды, но требуется значительно больше времени. Есть ли исцеление для этого?

Обновление Я наблюдал за некоторыми данными BLOB, которые возвращаются. Спасибо вам всем.

+1

8000ms на весь запрос? Вы уже измерили время от карты до Джона? – isnot2bad

+0

Из-за простоты структуры я дал бы ручную конструкцию ('StringBuilder') выстрел –

+2

Можете ли вы показать, как вы измеряете время, которое требуется GSON для создания вашей строки JSON. Я создаю гораздо большие строки JSON с GSON, чем это, и у меня вообще нет проблемы с производительностью. – bhspencer

ответ

2

Лучше использовать Jackson2

https://github.com/FasterXML/jackson

Java EE 7 имеет также новый API для обработки JSON, совершенно новый!

http://docs.oracle.com/javaee/7/api/javax/json/package-summary.html

Профилирование различные LIBS будут давать ответы. Для корпоративных приложений я никогда не использую GSON.

+0

Сначала я начал искать примерный пример того, почему GSON принадлежит к производственным корпоративным приложениям (в первую очередь потому, что это именно тот инструмент, который я использую в этом типе приложения), но чем больше я изучал вещи, тем более хорошие вещи Я читал о [Boon] (https://github.com/boonproject/boon), возможно, мне следует обновить мои предположения :) –

+0

Обязательно сравните с реалистичными настройками, включая разминку.НИКОГДА не запускайте JVM, не делайте ни одного вызова для чтения/записи JSON, предположите, что число имеет смысл. Половина «контрольных точек», которые публикуют люди, совершают эту ошибку, и я предполагаю, что она может быть применима здесь - первая накладная часть вызова мало влияет на стабильность работы. И FWTW, последние версии GSON имеют приемлемую производительность; но некоторые более старые версии (до 2.3, я думаю) имели действительно очень плохую производительность при чтении/записи POJO. Так что с помощью GSON используйте последнюю версию. – StaxMan

+0

И на Oracle: не беспокойтесь. Нет ничего полезного в использовании, абсолютно ничего лучше или даже хорошего, чем предлагают GSON, Jackson и Boon. Я понятия не имею, почему Oracle потратил время на это, учитывая множество твердых существующих решений. Может быть, просто привязать разработчиков к стандартам Oracle, а не к решениям OSS. – StaxMan

0
  1. Если вы хотите написать контрольные показатели, используйте JMH. Написание высококачественных тестов нелегко, и JMH делает много тяжелой работы для вас (хотя есть еще несколько ошибок).
  2. Если вам интересно, какая библиотека Java Json сериализуется/десериализуется быстрее для разных размеров полезной нагрузки, вы можете посмотреть на this extensive benchmark, который сравнивает десяток из них с JMH. Натощак - dsljson, второй - jackson. Gson на самом деле довольно медленный для «современной» библиотеки.