Обновление Copilot Studio до .NET 10 WebAssembly: 20% на холодном пути, 5% на горячем
Microsoft перевела WASM-движок Copilot Studio с .NET 8 на .NET 10. Двойной пакет JIT/AOT, fingerprinting и WasmStripILAfterAOT объясняют цифры.
7 мая 2026 года Daniel Roth опубликовал исследование по Copilot Studio в блоге .NET. Главная мысль: WebAssembly-среда выполнения Copilot Studio, поставляемая как NPM-пакет и встроенная во многие поверхности Microsoft 365, теперь работает на .NET 10 в продакшене. Выполнение на холодном пути стало примерно на 20% быстрее, на горячем пути примерно на 5%, а сама миграция в основном свелась к смене <TargetFramework>.
Самое интересное здесь, как Copilot Studio упаковывает два движка в один бандл, и что изменилось в инструментах WebAssembly у .NET 10, благодаря чему новая сборка стала меньше там, где это важно, и немного больше там, где это не важно.
Два движка, один пакет
Copilot Studio не выбирает между JIT и AOT. Он отправляет оба в одном NPM-пакете и позволяет странице загружать их параллельно.
JIT-движок загружается первым и сразу начинает обрабатывать пользовательские взаимодействия. AOT-движок, который больше по размеру и медленнее загружается, дочитывается в фоне. Как только он готов, среда выполнения передаёт активную сессию AOT, а JIT-движок отбрасывается. Пользователь видит быстрый первый отклик, а затем тихо более быструю работу до конца разговора.
Именно из-за этой двойной загрузки Copilot Studio так важно совместное использование ресурсов между движками. То, на что оба могут ссылаться, не должно скачиваться дважды.
Что на самом деле изменилось в .NET 10
Большую часть разницы объясняют два изменения в workload WebAssembly у .NET 10.
Во-первых, автоматический fingerprinting ресурсов. В .NET 8 команде приходилось запускать собственный шаг на PowerShell, чтобы добавить SHA256-хеш к каждому имени файла WASM и DLL, чтобы кеш и проверки целостности работали корректно. В .NET 10 это встроено, и вывод publish уже содержит имена вида dotnet.runtime.{hash}.js без какого-либо самодельного клея на MSBuild.
Во-вторых, WasmStripILAfterAOT включён по умолчанию. После AOT-компиляции исходный IL для скомпилированных методов больше не отправляется. Это уменьшает AOT-нагрузку, но также сокращает число файлов, которые могут совместно использовать JIT- и AOT-движки, потому что эксклюзивные для AOT файлы больше не несут IL, который нужен JIT-движку.
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<RunAOTCompilation>true</RunAOTCompilation>
<!-- Defaults to true on net10.0; shown here for clarity. -->
<WasmStripILAfterAOT>true</WasmStripILAfterAOT>
</PropertyGroup>
В .NET 8 между JIT- и AOT-движками Copilot Studio совместно использовались 59 файлов. В .NET 10 это число упало до 22. Пакет в целом вырос примерно на 15%. Такова цена удаления IL у AOT-методов: двойная модель теряет часть выигрыша от дедупликации.
Честное чтение цифр
Microsoft открыто говорит о компромиссе. AOT-загрузки примерно на 6% медленнее в быстрой LAN, что соответствует около 200 мс, и примерно на 17% медленнее на 4G-соединении, около 5 секунд. Этот штраф оплачивается в фоне, пока JIT уже обслуживает пользователя, поэтому он не виден в time-to-interactive. Он становится виден, если пользователь отключается посреди загрузки или запускает Copilot Studio в ограниченной сети.
Взамен:
- Холодный путь выполнения: ~20% быстрее.
- Горячий путь выполнения: ~5% быстрее.
- Никаких изменений кода, кроме перехода фреймворка.
Для нагрузки, которая работает внутри поверхностей Microsoft 365 и постоянно получает запросы, прирост в 20% на холодном пути на каждом взаимодействии важнее, чем пять секунд фоновой загрузки.
Что это значит для вашего Blazor WebAssembly-приложения
Если вы поставляете приложение на Blazor WebAssembly или .NET WASM и всё ещё на .NET 8, миграция дешёвая. Поднимите TargetFramework до net10.0, выполните restore, publish и дайте новому fingerprinting и значениям AOT по умолчанию отработать. Если у вас в pipeline есть собственный шаг хеширования или удаления IL, удалите его.
Если вы не поставляете двойные движки JIT и AOT (большинство приложений этого не делает), вы не увидите 15%-го роста пакета, который увидел Copilot Studio. Вы получите экономию от удаления IL без потерь на дедупликации. Именно под эту конфигурацию настроены значения по умолчанию в .NET 10.
Полное исследование, включая детали развёртывания и то, как Copilot Studio измеряет эти цифры в продакшене, доступно в блоге .NET.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.