Повторно использовать JSONDecoder или воссоздавать его при каждом запросе? - PullRequest
0 голосов
/ 20 февраля 2019

В асинхронной среде более эффективно использовать один JSONDecoder для всех запросов (может привести к задержкам, если несколько потоков ожидают блокировки) или более эффективно создавать новый JSONDecoder для каждого нового запроса?

Документация Apple гласит, что класс JSONDecoder можно использовать повторно, но они не уточняются.

https://developer.apple.com/documentation/foundation/jsondecoder

1 Ответ

0 голосов
/ 20 февраля 2019

На платформах Apple JSONDecoder использует JSONSerialization для первоначального анализа, а затем создает новый __JSONDecoder (внутренний класс) для фактического выполнения декодирования.Он передает _Options, который является структурой, поэтому он копируется.Поэтому не должно быть никакого взаимодействия между потоками, если вы не изменяете параметры (что не является потокобезопасным).

Так что, вероятно, немного дешевле использовать тот же декодер, посколькуон избегает выделения и освобождения экземпляра класса, что является обычно победой над простым сохранением и освобождением экземпляра класса (и я ожидал бы, что так будет и здесь).Но я ожидаю, что разница будет очень, очень мала по сравнению с гораздо большей стоимостью декодирования JSON.

На самом деле, если бы у меня была ситуация, когда это действительно стоило бы профилировать (и вам нужно было бы ее профилировать)чтобы узнать, быстрее это или нет), я бы спросил: «Почему в мире я так быстро декодирую столько разных JSON-сообщений?»Для этого важно, чтобы JSON, вероятно, не приходил из сети или с диска (они настолько безумно медленны, что лишний раз выделяет один дополнительный класс).Это будет иметь значение только в том случае, если вы работаете с JSON, который уже находится в памяти в виде огромного количества маленьких сообщений.И в этом случае ответ почти наверняка будет «прекратить использовать JSON для этой проблемы».

Но я ожидаю, что почти во всех случаях это просто не имеет значения, и я определенно не буду активно оптимизировать его,Внедрите все, что яснее в вашем коде.Затем профилируйте код, чтобы увидеть узкие места.

...