Команда Copilot Studio сделала то, о чём все разработчики Blazor WASM были любопытны: они действительно обновили производственное приложение с .NET 8 до .NET 10 и измерили результаты. Пост содержит конкретные цифры, что редко встречается и по-настоящему полезно.
Обновление Было Скучным (Это Хорошо)
Обновить целевой фреймворк, обновить ссылки на пакеты, исправить нарушающие изменения. Вот и всё. Сборка .NET 10 теперь работает в продакшене. Сама миграция не была интересной частью — изменения в .NET 10 таковыми являются.
Автоматическое Отпечатывание Ресурсов
Раньше развёртывание WASM-приложения означало написание пользовательских скриптов для переименования опубликованных ресурсов с SHA256-хэшами для сброса кэша. Copilot Studio имел скрипт PowerShell, делавший именно это — переименовывать файлы, внедрять атрибуты integrity в JavaScript-загрузчик, управлять всем вручную.
В .NET 10 всё это встроено. Опубликованные ресурсы автоматически получают отпечаток, импортируются непосредственно из dotnet.js и проверяются на целостность без ручного вмешательства. Команда удалила скрипт переименования.
Небольшое изменение в объёме, значительное снижение сложности.
WasmStripILAfterAOT Теперь Включён по Умолчанию
В .NET 8 удаление IL из AOT-скомпилированных сборок было opt-in. В .NET 10 это поведение по умолчанию. После AOT-компиляции исходный IL-байткод удаляется из выходных данных — он не нужен во время выполнения, а его сохранение раздувало размер пакета без причины.
Copilot Studio использует специфическую оптимизацию: он поставляет как JIT-движок (быстрый запуск), так и AOT-движок (максимальная производительность в установившемся режиме), загружая оба параллельно и переключаясь с JIT на AOT, когда он готов. Также дедуплицируются файлы, идентичные между двумя движками.
Новое поведение удаления IL означает, что AOT-сборки больше не совпадают побайтно со своими JIT-аналогами, поэтому меньше файлов дедуплицируется:
- .NET 8: 59 общих файлов
- .NET 10: 22 общих файла
Чистый результат: примерно на 15% больший размер пакета для AOT-движка. Загрузка AOT примерно на 6% медленнее по быстрой LAN, примерно на 17% медленнее по 4G. Но всё это происходит в фоновом режиме после того, как приложение уже интерактивно.
Цифры Производительности
Это часть, которая важна:
- ~20% быстрее при первом вызове (холодный путь)
- ~5% быстрее при последующих вызовах (тёплый путь)
Улучшения наиболее заметны в “больших ботах” — крупных, сложных агентах, где доминирует AOT-скомпилированный код. Для более простых рабочих процессов выигрыш меньше.
Если Вы Ещё на .NET 8
История миграции действительно проста: обновите <TargetFramework>, обновите ссылки на пакеты, удалите любые пользовательские скрипты отпечатывания, и вы автоматически получите преимущества от WasmStripILAfterAOT. Если вы компилируете AOT, ожидайте аналогичных улучшений производительности.
Замечание из поста: если вы загружаете рантайм .NET WASM внутри WebWorker, установите dotnetSidecar = true при инициализации.
Оригинальный пост: Copilot Studio gets faster with .NET 10 on WebAssembly
