Задержки и производительность напрямую связаны с режимом запуска Blazor WebAssembly-приложения. В Debug-режиме любое изменение свойств элементов управления или связанных параметров могло вызывать зависания интерфейса на 20-30 секунд и более, в зависимости от сложности страницы.
Как воспроизводится проблема?
Если запускать приложение через Visual Studio (dotnet build / dotnet run), длительные задержки стабильно воспроизводятся. Однако после публикации приложения ситуация кардинально меняется:- выполняется dotnet publish;
- приложение запускается из командной строки;
- задержки практически исчезают.
Это важный момент при диагностике производительности Blazor WebAssembly-приложений.
Почему так происходит?
Debug-режим работает значительно медленнее, при dotnet build / dotnet run:- C# компилируется в IL (Intermediate Language);
- браузер загружает IL-сборки;
- код выполняется через .NET runtime в WebAssembly.
В Debug-конфигурации отключены многие оптимизации, поэтому тяжёлые вычисления работают заметно медленнее. Особенно это заметно для библиотеки SixLabors.ImageSharp, активно использующей обработку и преобразование изображений.
Что меняет dotnet publish?
Публикация включает Release-оптимизации:- удаляется неиспользуемый код (trimming);
- уменьшается размер приложения;
- включаются runtime-оптимизации;
- снижаются накладные расходы выполнения.
Уже этого достаточно, чтобы производительность выросла в несколько раз. Важно!
AOT включается не автоматически! Существует распространённое заблуждение, что dotnet publish автоматически включает AOT-компиляцию. На самом деле, полноценный Native AOT нужно включать отдельно, это делается при помощи специального параметра в файле проекта:
<RunAOTCompilation>true</RunAOTCompilation>
Итог
Разница между Debug и Publish в Blazor WebAssembly может быть огромной, поэтому перед анализом производительности важно проверить:- используется ли Release-сборка;
- включён ли AOT;
- воспроизводится ли проблема после dotnet publish.
Во многих случаях опубликованная версия приложения работает в несколько раз быстрее и полностью устраняет критические задержки интерфейса, возникающие при отладке приложения.