· · 2 минут чтения

Как Copilot Studio Перешёл на .NET 10 WebAssembly и Стал на 20% Быстрее

Улучшения .NET 10 WASM — не только для новых проектов. Вот что измерила команда Copilot Studio после обновления с .NET 8: автоматическое отпечатывание, WasmStripILAfterAOT по умолчанию и реальные цифры производительности выполнения.

.NET .NET 10 WebAssembly Blazor Performance
Эта статья также доступна на:English, Català, Español, Deutsch, Français, Português, Italiano, 日本語, 中文, 한국어, हिन्दी, Polski, Türkçe, العربية, Bahasa Indonesia, Nederlands

Команда 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

Поделиться:
Просмотреть исходный код этой статьи на GitHub ↗
← Azure SQL Теперь Может Генерировать Эмбеддинги — На Чистом T-SQL, Без Слоя Приложения
Cosmos DB Shell В Публичной Предварительной Версии — И В Нём Встроен MCP-Сервер →