Комментарии 26
Спасибо! Ещё можно вот эту штуку посмотреть jayrock.berlios.de/
Из этого всего пользовался только Newtonsoft.Json, про некоторые описанные в статье даже не слышал. Есть еще библиотека FastJson www.codeproject.com/KB/IP/fastJSON.aspx, которая работает немного быстрее Newtonsoft, судя по графикам и моим тестам. А вообще после проведения тестов, написали свою библиотеку для сериализации/дессериализации Json.
>> Сложно придумать способ получающий строку в формате JSON быстрее.
Учитывая иммутабельность строк, использовать конкатенацию в качестве эталона скорости — очень странное решение. Для таких целей придуман StringBuilder.
Учитывая иммутабельность строк, использовать конкатенацию в качестве эталона скорости — очень странное решение. Для таких целей придуман StringBuilder.
Я просто оставлю это здесь
www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx
www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx
Сложно серьезно рассматривать тест, в котором не используется главная возможность StringBuilder — аллокация памяти по строковой буффер. Без нее он, естественно, ведет себя точно также как иммутабельные строки.
Пруфтест?
Пруфтест — хотя бы статья на которую вы же и ссылаетесь, просто читать ее надо внимательней и применять к тому кейсу, который обсуждается, а не абстрактно. На графике прекрасно видно, как с ростом буфера ведет себя билдер, а как остальные методы. Билдер тормозит, поскольку по дефолту он поднимает capacity на длине 16, 32, 64, а потом начинает разгоняться, поскольку все реже и реже нуждается в реаллокациях. Строковые методы напротив начинают тормозить, поскольку с ростом строки ее все тяжелее каждый раз копировать. Просто автор мало того, что не инициализировал билдер как следует, так еще и остановился на конкатенации только 10 строк. Я думаю не надо доказывать, что это не кейс JSON-сериализации.
А лучше сразу писать в TextWriter.
Почему тестировали на .NET 3.5? Было бы интересно расмотреть поведение там.
Эх, еще бы сравнить скорость сериализации JSON и XML…
Автор вот этой штуки утверждает, что она по скорости уделывает всё остальное. Сравните в том же окружении, если не трудно.
И такой вопрос, когда на Mono тестировали, были ли включены оптимизации (mono -O=all yourfile.exe)? Так же хотелось бы узнать, учитывалось ли время на «прогрев» среды?
Это не Ява, прогревать тут нечего. Один раз, при запуске, в первой итерации теста бинарник в репозиторий попал, и все.
Про emit кода в рантайме, чтобы не ломиться каждый раз через рефлекшн вы слышали? Некоторые библиотеки его активно эксплуатируют для оптимизации. В моно так вообще по умолчанию используется «ленивый» JIT, если ему не сказать --compileall. Так что первый вызов может быть в разы медленее, чем последующие.
Тьфу, не так прочитал. В общем, изначально имелось ввиду, сравнивался ли «холодный» вызов или последующие.
Компилировал и запускал в Monodevelop и VisualStudio с теми настройками, которые там есть «по умолчанию».
Чтобы исключить время «прогрева», я перед тестом 1 и 2, каждый сериализатор прогонял по 1-му разу.
Чтобы исключить время «прогрева», я перед тестом 1 и 2, каждый сериализатор прогонял по 1-му разу.
Мне нужно было как-то сериализовать весьма большой кусок данных, с весьма простой структурой, желательно побыстрее. Был неприятно удивлен тем, насколько штатные сериализаторы тормозные.
~6 раз — это как-то уж слишком накладно. Может есть что-то быстрое?
~6 раз — это как-то уж слишком накладно. Может есть что-то быстрое?
спасибо, очень полезная статья
Простите, я что-то не совсем поляла, как именно вы тестируете сериализаторы.
Вы вообще что сериализируете? Какой грубины граф? Встречаются ли там повторяющие типы? Зацикленый ли граф объектов? Размер объектов?
Из того, что можно в статье увидеть, вы проверили, как быстро сериализаторы запускаются, и сериализируют «простые данные», типа двух строк. Умеет ли сериализатор справляться с интерфейсами, коллекциями и прочими абстракциями.
Реально, если на кубиках, вы подвесили на подъёмнике машину и нажали педаль газа.
В заключении вы написали:
1. BMW — скокрость раскручивания колеса составляет N ms
2. Lada Granta — M ms.
3. F1 — -Z ms
Вы вообще что сериализируете? Какой грубины граф? Встречаются ли там повторяющие типы? Зацикленый ли граф объектов? Размер объектов?
Из того, что можно в статье увидеть, вы проверили, как быстро сериализаторы запускаются, и сериализируют «простые данные», типа двух строк. Умеет ли сериализатор справляться с интерфейсами, коллекциями и прочими абстракциями.
Реально, если на кубиках, вы подвесили на подъёмнике машину и нажали педаль газа.
В заключении вы написали:
1. BMW — скокрость раскручивания колеса составляет N ms
2. Lada Granta — M ms.
3. F1 — -Z ms
Я в самом начале статьи указал, что статья есть не детальный обзор, и тесты проводились под те потребности, с которыми столкнулся я. Когда у меня появится потребность в сравнении функциональных возможностей сериализаторов, я напишу об этом статью, если Вы не сделаете этого раньше.
На типы объектов можно посмотреть, открыв исходный код теста — ссылка есть в статье.
На типы объектов можно посмотреть, открыв исходный код теста — ссылка есть в статье.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Сравнение производительности JSON-сериализаторов для .NET