Ответ 1
Вы ничего не сделали неправильно.
В iOS 6 изменились вещи. Apple значительно улучшила производительность NSJSONSerialization
. При использовании iOS 6 и выше он является самым быстрым.
JSONKit также не обновлялся через год. Он отстает.
Я вытащил код из http://www.bonto.ch/blog/2011/12/08/json-libraries-for-ios-comparison-updated/ и протестировал его на моей локальной машине.
Я был удивлен результатами, а NSJSonSerialization показал гораздо лучшую производительность, чем JSONKit.
Неужели NSJSonSerialization действительно обогнала JSONKit с точки зрения скорости или я сделал что-то неправильно?
twitter_timeline.json
repeat.json
random.json
Вы ничего не сделали неправильно.
В iOS 6 изменились вещи. Apple значительно улучшила производительность NSJSONSerialization
. При использовании iOS 6 и выше он является самым быстрым.
JSONKit также не обновлялся через год. Он отстает.
Интересно, что по-прежнему есть люди, которые заботятся о производительности парсера 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 МБайт
Некоторые другие тестовые файлы, в значительной степени средние JSON:
JSON в основном числа:
JSON с преимущественно случайными строками Unicode.
Эти строки JSON содержат символы Unicode noncharacters и Unicode NULL. JSONKit не позволяет этим символам - таким образом, не удается. JPJson не разрешит их по умолчанию, но у него есть параметры, которые при настройке разрешают эти символы в строках JSON:
Я запустил тест для 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
Я запускаю тесты на iPhone 4 (ios7) и iPhone 4S (ios 6.1), а NSJSONSerialization быстрее в обоих случаях.