TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.64K subscribers
Post #312 1.15K
🔢 Невидимый тормоз: как Codable съедает производительность вашего приложения.

Если вы пишете на Swift, вы почти наверняка используете Codable. Это элегантное решение для сериализации, ставшее стандартом де-факто. Но за кажущейся простотой скрывается сложный механизм, производительность которого в реальных сценариях часто далека от идеала.

Сегодня обсудим главные тезисы из статьи, в которой рассказывается как Codable ведет себя в условиях большого приложения с сотнями моделей и тысячью строк JSON на старте. Ребята обнаружили, что JSONDecoder и JSONEncoder могут тратить сотни миллисекунд на, казалось бы, простые операции, и нашли способы ускорить их работу в разы. Результатом этой работы стал Pull Request в репозиторий swift-foundation.


Где искать настоящие проблемы, а не синтетические цифры:

Первая ошибка - измерять производительность Codable в вакууме, декодируя один и тот же объект миллион раз в цикле. В реальности приложение при старте часто парсит множество разных моделей данных, и каждая из них встречается впервые. Именно в этот момент проявляются издержки динамической природы Swift Runtime.

Ключевой метод, который становится узким местом - swift_conformsToProtocolMaybeInstantiateSuperclasses. Он ищет, соответствует ли тип требуемому протоколу. В приложении с обширной кодовой базой таких соответствий может быть сотни или тысячи. Линейный поиск по этому массиву при каждом первом обращении к новому Codable-типу - дорогая операция.


Первый пример из кода Foundation:

// Пример из старой реализации JSONDecoder
func unwrap<T: Decodable>(...) throws -> T {
...

if T.self is _JSONStringDictionaryDecodableMarker.Type {
return try self.unwrapDictionary(...)
}
}


Оператор is здесь запускает поиск соответствия типа T протоколу _JSONStringDictionaryDecodableMarker. Это происходит даже когда в этом нет необходимости (например при стандартной стратегии преобразования ключей).

Что изменили: Добавили проверку флага keyDecodingStrategy.isDefault. Каст к специальному протоколу теперь выполняется только тогда, когда это действительно нужно. Аналогичную оптимизацию применили и для JSONEncoder.


Скрытая цена CodingKey:

Каждый автоматически сгенерированный enum CodingKeys - это не просто перечисление. Это полноценный тип, который реализует протоколы CodingKey, Hashable, Equatable, CustomStringConvertible, CustomDebugStringConvertible. Каждое такое соответствие добавляет запись в тот самый массив, по которому работает медленный поиск.


Проблема усугубляется в generic-контейнерах:

// Объявление из стандартной библиотеки
public struct KeyedDecodingContainer<K: CodingKey>


При создании такого контейнера (а он создается для каждой модели в container(keyedBy:)) Runtime снова ищет соответствие вашего конкретного CodingKeys.self протоколу CodingKey. При 6000 уникальных моделей в приложении это 6000 лишних поисков при первом запуске.

Новый подход: Максимальный отказ от уникальных CodingKeys в пользу общего типа, например, String или специальной структуры AnyCodingKey. Это дает двойной выигрыш:

🔵Резко сокращает количество вызовов тяжелого метода.

🔵Уменьшает размер бинарного файла приложения (каждый CodingKeys добавляет ~1.8 КБ кода).


💡 Вывод:

Работа с Codable напоминает движение по скоростному шоссе: на пустой дороге кажется, что все идеально, но в час пик начинаются пробки. Исследование показало, что производительность сериализации в Swift - это не вопрос синтетических тестов, а практическая проблема, влияющая на реальные метрики приложений. Узкие места скрыты не в алгоритмах парсинга JSON, а в фундаментальных механизмах языка: динамических проверках времени выполнения и создании избыточных типов.


➡️ Подписаться на канал
Мобильный трудоголик
  • 👍 20
  • 🤯 5
  • 🔥 2
  • 🤔 1
  • 👀 1
More from @hardworkerit
  1. Oct 2, 2026👣 Архитекторы, тестировщики и кодеры. Создаем мультиагентную команду Разработка с ИИ-аген…
  2. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
  3. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  4. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
  5. Sep 25, 2026🔢 Приватные свойства больше не ломают memberwise инициализатор в Swift 6.4 Swift автомати…
  6. Sep 24, 2026👨‍💻 Почему разработчики ненавидят своих менеджеров. Всем привет! Сегодня хочу разобрать…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →