2013-04-20 2 views
3

У меня есть библиотека JSon на GitHub https://github.com/jillesvangurp/jsonjджексон против JSON простой для потока разборе

Эта библиотека синтаксический анализатор на основе JSON простой, который использует класс обработчика, чтобы сделать всю работу по созданию экземпляров JSONObject, JsonArray, и JsonPrimitive, которые у меня есть в моей библиотеке.

Я видел, как люди публиковали различные тесты, предлагая, чтобы парсером Джексона было так же хорошо, как и с точки зрения производительности, и что json simple является одним из более медленных вариантов. Итак, чтобы увидеть, могу ли я повысить производительность, я создал альтернативный парсер, который использует API потокового трафика jackson и вызывает тот же обработчик, который я использовал для исходного анализатора. Это прекрасно работает с функциональной точки зрения и довольно просто.

Вы можете найти соответствующие классы здесь (JsonHandler, JsonParser и JsonParserNg): https://github.com/jillesvangurp/jsonj/tree/master/src/main/java/com/github/jsonj/tools

Однако, я не вижу каких-либо улучшений на различных тестов я побежал.

Итак, мой вопрос: должен ли я видеть какое-либо улучшение вообще, и если да, то почему? Мне кажется, что в потоковом режиме API, по крайней мере, обе библиотеки имеют схожую производительность.

Я был бы очень заинтересован в опыте других людей.

+0

Не решение, ни ответ на ваш реальный вопрос, но по их собственным критериям, json-smart является самым быстрым из всех тестируемых, включая json-simple и jackson. https://code.google.com/p/json-smart/. Кроме того, он использует точно такой же интерфейс, как json-simple, поэтому перенос должен быть быстрым. Однако много комментариев на одном сайте говорят, что люди получают разные результаты, поэтому YMMV. – Colselaw

+0

Спасибо, я тоже могу попробовать. –

+0

Json-smart не быстрее, чем альтернативы в соответствии с любым общедоступным эталоном. Оценки, упомянутые на странице проекта, имеют недостатки, о которых свидетельствуют комментарии; включая использование странных данных ({«значение»: 123} и такое - действительно?). – StaxMan

ответ

6

Я написал «On proper performance testing of Java JSON processing» некоторое время назад, чтобы перечислить общие проблемы, которые я видел с бенчмаркингом производительности. Существует множество относительно простых способов испортить сравнение. Я предполагаю, что вы не ошибаетесь, но стоит упомянуть. Специальная часть об использовании исходного ввода: очень мало случаев, когда реальные данные JSON поступают как String - поэтому не забудьте использовать InputStream/OutputStream (или байтовые массивы).

Второе, что следует отметить, что в том, что если вы используете модель дерева (как JsonObject) вы уже добавив множество потенциально предотвратимых накладных расходов: вы строите Map/List структуры, которые используют 3x память, POJOs будет использовать; и работают медленнее. В этом случае фактические служебные данные синтаксического анализа/генерации обычно являются компонентом меньшинства. Иногда обработка дерева в стиле имеет смысл, и это приемлемо накладные расходы.

Так, если производительность имеет значение много, один, как правило, либо:

  1. использует потоковый API для создания собственных объектов - не дерево в памяти, или
  2. использует привязку данных к/от POJOs , Это может быть близко к скорости (1)

, оба из которых будут быстрее, чем строить деревья (и в некоторой степени, сериализовать). По некоторым причинам многих разработчиков как-то предположить, что дело с деревом представлений как эффективный способ борьбы с данными, как все - это не так, и видел в тестах, как https://github.com/eishay/jvm-serializers

я не видел Джексон-коды, связанную с помощью link, поэтому я предполагаю, что он работает так, как ожидалось. Основные вещи, чтобы искать (Probs производительности WRT) на самом деле являются:

  1. Всегда рядом JsonParser и JsonGenerator (требуется для некоторых рециркуляции) и
  2. Многократное JsonFactory и/или ObjectMapper случаи: они резьбовых через эти объекты происходит повторное использование некоторых компонентов (таблиц символов, сериализаторов).
  3. Как упоминалось ранее, всегда используйте большинство исходных пунктов ввода/вывода, если это возможно (InputStream, OutputStream).
+0

Спасибо, я подозревал столько же. Моя библиотека по дизайну - это все о древовидных структурах, поэтому я не могу много сделать. Я на самом деле не понимал, что мне нужно закрыть синтаксический анализатор, поэтому я просто это исправил. –

+0

Хорошо. Да, я подумал, что, вероятно, была причина использовать более гибкую модель. Я надеюсь, что закрытие помогает в некоторой степени, но различия могут быть не астрономическими. – StaxMan

+0

@StaxMan Я заметил ваш опыт в сериализации. Если у вас есть время, просмотрите http://stackoverflow.com/questions/21781540/test-code-to-compare-jackson-stream-vs-map-is-this-working-right. КР, извинения за нарушение. –

Смежные вопросы