Тесты JSONKit

Я вытащил код из http://www.bonto.ch/blog/2011/12/08/json-libraries-for-ios-comparison-updated/ и протестировал его на моей локальной машине.

Я был удивлен результатами, а NSJSonSerialization показал гораздо лучшую производительность, чем JSONKit.

Неужели NSJSonSerialization действительно обогнала JSONKit с точки зрения скорости или я сделал что-то неправильно?

twitter_timeline_json.png

twitter_timeline.json

repeat_json.png

repeat.json

random_json.png

random.json

Ответ 1

Вы ничего не сделали неправильно.

В iOS 6 изменились вещи. Apple значительно улучшила производительность NSJSONSerialization. При использовании iOS 6 и выше он является самым быстрым.

JSONKit также не обновлялся через год. Он отстает.

Ответ 2

Интересно, что по-прежнему есть люди, которые заботятся о производительности парсера JSON;)

Примерно три года назад я разработал собственный анализатор JSON с целью сделать его быстрым и с низкой памятью. С тех пор мне было интересно, как это сравнивается с другими, особенно с NSJSONSerialization и JSONKit. У меня есть несколько контрольных меток, которые я иногда запускаю, чтобы проверить, как новые компиляторы и ОС улучшили парсеры. Я также разыграл стенд Bonto, исправил несколько ошибок, добавил несколько патологических файлов JSON и добавил свой собственный парсер.

Хорошо, я могу подтвердить, что в последние годы производительность NSJSONSerialization значительно улучшилась. Теперь он сопоставим с JSONKit для многих рабочих нагрузок. Если я правильно помню, определенный тест занял 690 мс для NSJSONSerialization iOS 5.0, а теперь он работает на 520 мс на iOS 6.1. JSONKit занял около 524 мс - и теперь с теми же источниками - он занимает около 500 мс, последний - исключительно из-за лучших компиляторов.

Поскольку мне было любопытно, я собрал некоторые результаты, скомпилированные с Xcode (скоро доступно) и несколько скриншотов, снятых с моего раздвоенного знака Bonto.

Тест включает мою собственную парсерную библиотеку (JPJson) в тесте с именем "JPJsonData" (новейшая версия, которая еще не зарегистрирована в GitHub), в честном и сопоставимом тесте. Я гарантировал, что JSONKit был скомпилирован с включенными оптимизациями и отключенными утверждениями, чтобы он был как можно быстрее.

Тест был протестирован на этом оборудовании, iPad 2 (второй вариант), с этими спецификациями:

Имя системы: iPhone OS Версия системы: 6.1.3 Модель: iPad Локализованная модель: iPad Платформа: iPad2,2 Аппаратная модель: K94AP Тип платформы: 14 Платформенная строка: iPad 2G Частота процессора: 475,113 МГц Частота шины: 475,113 МГц Общая память: 502 МБайт Пользовательская память: 419 МБайт

enter image description here


Некоторые другие тестовые файлы, в значительной степени средние JSON:

enter image description here


JSON в основном числа:

enter image description here


JSON с преимущественно случайными строками Unicode.

Эти строки JSON содержат символы Unicode noncharacters и Unicode NULL. JSONKit не позволяет этим символам - таким образом, не удается. JPJson не разрешит их по умолчанию, но у него есть параметры, которые при настройке разрешают эти символы в строках JSON:

enter image description here


Update

Я запустил тест для iPhone 5s на iOS 7, как для 32-разрядных, так и для 64-разрядных.

JSONKit не удалось скомпилировать для 64-разрядных версий.

System Name: iPhone OS
System Version: 7.0.4
Model: iPhone
Localized Model: iPhone
Platform: iPhone6,2
Hardware Model: N53AP
Platform Type: 18
Platform String: Unknown iPhone
CPU Frequency: 0 MHz
BUS Frequency: 0 MHz
Total Memory: 999 MByte
User Memory: 858 MByte

Все тайминги в миллисекундах.

-----------------------------------
twitter_timeline.json

| Library             |  32-bit |  64-bit |
|---------------------|--------:|--------:|
| JSONKitData         |   1.68  |       *)|
| JPJsonData          |   1.16  |    1.29 |
| NSJSONSerialization |   2.44  |    2.21 |
| SBJsonData          |   6.05  |    6.69 |



-----------------------------------
appache_builds.json

| Library             |  32-bit |  64-bit |
|---------------------|--------:|--------:|
| JSONKitData         |    2.80 |      *) |
| JPJsonData          |    3.21 |    3.52 |
| NSJSONSerialization |    3.23 |    4.17 |
| SBJsonData          |   10.41 |   11.75 |


-----------------------------------
mesh.json

| Library             |  32-bit |  64-bit |
|---------------------|--------:|--------:|
| JSONKitData         |   87.64 |      *) |
| JPJsonData          |   25.46 |   20.34 |
| NSJSONSerialization |  144.25 |   34.25 |
| SBJsonData          |  105.60 |  107.70 |



-----------------------------------
sample.json

| Library             |  32-bit |  64-bit |
|---------------------|--------:|--------:|
| JSONKitData         |  failed |      *) |
| JPJsonData          |    5.97 |    6.39 |
| NSJSONSerialization |   18.94 |   13.66 |
| SBJsonData          |  failed |   88.19 |


-----------------------------------
random.json

| Library             |  32-bit |  64-bit |
|---------------------|--------:|--------:|
| JSONKitData         |   23.01 |      *) |
| JPJsonData          |   17.69 |   20.62 |
| NSJSONSerialization |   28.83 |   28.60 |
| SBJsonData          |   82.93 |   82.74 |

*) Failed to compile

Ответ 3

Я запускаю тесты на iPhone 4 (ios7) и iPhone 4S (ios 6.1), а NSJSONSerialization быстрее в обоих случаях.

enter image description here

enter image description here