JSON вынесли в isolate. А какую проблему решили?

На ревью приходит изменение: разбор большого JSON перенесён в отдельный isolate — независимый контекст выполнения Dart-кода. Индикатор загрузки перестал замирать, но готовые данные теперь приходят позже.

Откатить, потому что операция стала медленнее? Оставить, потому что анимация работает? Если задача звучит как «улучшить производительность», обе позиции можно защищать долго. До выбора API не определили, какое поведение требуется исправить.

В эксперименте ArkTelos Lab одна и та же строка JSON превращалась в полный список объектов. Сравнивались основной isolate, новый на каждый запрос и постоянно работающий обработчик. Синхронный код на основном isolate делит время с интерфейсом; отдельный контекст позволяет их разделить, но добавляет расходы на запуск и передачу результата.

На MacBook Air M1, во Flutter profile, для 100 тысяч записей медиана времени до готового списка выросла с 210,1 до 273,1 мс при переходе к новому isolate. Одновременно медиана самого длинного промежутка между кадровыми callback около запроса сократилась с 219,2 до 20,4 мс.

Данные появились позже, пауза анимации стала короче. Измерение не выбирает, что важнее продукту. Реакция на нажатия и пользовательские предпочтения в опыте не проверялись.

Если жалоба касается застывающего индикатора, откат только из-за времени получения списка может вернуть исходную проблему. Если требуется раньше показать данные, движение индикатора ещё не доказывает, что задача решена. На ревью стоит восстановить конкретный сценарий. Что происходило после ответа сервера: останавливалась анимация, задерживался результат или нельзя было выполнить действие? Какой эффект устраняется и чем это подтверждается?

Метрика должна относиться к этому сценарию. В том же опыте 95% всех кадровых промежутков укладывались примерно в 17,2 мс, хотя рядом с тяжёлыми запросами возникали паузы за 200 мс. Между ними проходило много обычных кадров. Верное число отвечало не на тот вопрос.

Следующий вопрос — что именно вынесли. Разбор строки может закончиться раньше создания моделей, фильтрации и сортировки. Если всё это остаётся на основном isolate, наличие отдельного обработчика ещё не объясняет, почему экран перестанет замирать.

В стенде возвращался законченный результат: весь список объектов с вложенными тегами. Для реального экрана им может стать небольшая подборка. Но это уже другой договор с вызывающим кодом, который нужно сравнивать по задаче экрана, а не выдавать за ускорение прежней операции.

Постоянный обработчик экономит повторный запуск, но не делает бесплатной доставку списка. В опыте он вернул большой результат позже остальных. Механизмы возврата различаются; весь разрыв одной причиной не объяснялся. Если каталог нужен для последующих поисков, его можно оставить рядом с обработчиком. Тогда возникают вопросы хранения: когда обновлять данные, какой версии соответствует ответ, кто вправе менять записи. Для однократной загрузки это может быть лишней сложностью. Для повторных запросов — оправданной архитектурой.

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

По такому условию можно выбрать измерения и позднее понять, зачем изменение осталось в коде. Требование «ускорить JSON» этого не объясняет.

Код, таблица и ограничения: https://labs.arktelos.dev/ru/articles/json-isolates-trial/ Исходники: https://gitlab.com/open8381011/experiments/json-isolates-trial Проверялся macOS/M1, не Android, iOS или Web. ArkTelos: https://arktelos.dev Telegram RU: https://t.me/arktelos_lab_ru Telegram EN: https://t.me/arktelos_lab

JSON вынесли в isolate. А какую проблему решили? | Сетка — социальная сеть от hh.ru