- Без dbcontext разминка, нагрузка первой страницы занимает ~ 8,1 секунды
- с dbcontext
- с dbcontext разминкой, мой журнал запуска приложения показывает dbcontext ~ 7.9. Тем не менее, загрузка первой страницы по -прежнему занимает ~ 7,8 секунды < /p>
< /li>
< /ul>
Это не кажется правильным. Похоже, что нагревание dbcontext практически не влияет на воспринимаемое пользователем время начальной загрузки. Насколько я понимаю, что модельная компиляция EF Core была основной частью холодного старта, но мои результаты предполагают, что существует еще одно узкое место схожей величины. Если нет, то что может быть узким местом? Это сама фреймворк Blazor, настройка подключения SignalR или что -то еще, что мне не хватает?(с логикой разминки):Код: Выделить всё
Program.cs(страница медленной загрузки):Код: Выделить всё
// using statements... var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddDbContextFactory(options => options.UseNpgsql(connectionString)); builder.Services.AddSingleton (); var app = builder.Build(); // --- Application Warm-up --- Console.WriteLine("Application is starting, beginning warm-up..."); using (var scope = app.Services.CreateScope()) { var timer = new Stopwatch(); timer.Start(); var services = scope.ServiceProvider; try { var dbContextFactory = services.GetRequiredService(); await using (var dbContext = await dbContextFactory.CreateDbContextAsync()) { await dbContext.Database.CanConnectAsync(); timer.Stop(); Console.WriteLine($"Database context has been successfully warmed up, took {timer.ElapsedMilliseconds} ms."); } } catch (Exception ex) { // ... error logging ... } } // ... rest of Program.cs ... app.Run(); < /code> DbTest.razor(используется для времени):Код: Выделить всё
@page "/db-test" @using System.Diagnostics @using Microsoft.EntityFrameworkCore @using BlazorApp.Data @using BlazorApp.Model @using BlazorApp.Services @inject IDbContextFactory DbFactory @inject PageLoadTimerService GlobalTimerService @rendermode InteractiveServer Database Relation Test @if (fullLoadTimeInMs.HasValue) { [b]Full Load Time (from click to completion):[/b] @fullLoadTimeInMs.Value.ToString("F2") ms } @if(hotLoadTimeInMs.HasValue) { [b]OnInitializedAsync Duration (Hot Load):[/b] @hotLoadTimeInMs.Value.ToString("F2") ms } Database Relation Test Action Panel 1. Create New Post with Tags 2. Load/Refresh Posts 3. Update First Post's Tags 4. Delete First Post Clear Logs [h4]Status Log:[/h4] @foreach (var log in logs) { @log.Message } Current Post List: @if (isLoading) { Loading... } else if (posts.Count == 0) { No posts in the database. Please create one first. } else { @foreach (var post in posts) { @post.Title (ID: @post.Id) @post.Content @foreach (var tag in post.Tags) { @tag.Name } Created at: @post.CreatedDate.ToLocalTime() } [/list] } @code { private double? fullLoadTimeInMs; private double? hotLoadTimeInMs; // ... other properties and methods ... protected override async Task OnInitializedAsync() { var hotLoadStopwatch = Stopwatch.StartNew(); await LoadPosts(); hotLoadStopwatch.Stop(); hotLoadTimeInMs = hotLoadStopwatch.Elapsed.TotalMilliseconds; fullLoadTimeInMs = GlobalTimerService.GetLastMeasurement(); StateHasChanged(); } private async Task LoadPosts() { Log("Loading posts from the database...", "text-info"); isLoading = true; try { await using var dbContext = CreateDbContext(); posts = await dbContext.Posts .Include(p => p.Tags) // Eager-load the related Tags .OrderByDescending(p => p.CreatedDate) .ToListAsync(); Log($"✅ Successfully loaded {posts.Count} posts.", "text-success"); } catch (Exception ex) { Log($"❌ Load failed: {ex.Message}", "text-danger"); } finally { isLoading = false; StateHasChanged(); } } < /code> PageLoadTimerService.cs
public class PageLoadTimerService
{
private long _startTimeTicks = 0;
private double? _lastMeasurement = null;
public void Start()
{
_startTimeTicks = Stopwatch.GetTimestamp();
_lastMeasurement = null;
}
public double? GetLastMeasurement()
{
if (_startTimeTicks != 0)
{
var endTimeTicks = Stopwatch.GetTimestamp();
var elapsed = Stopwatch.GetElapsedTime(_startTimeTicks, endTimeTicks);
_lastMeasurement = elapsed.TotalMilliseconds;
_startTimeTicks = 0;
}
return _lastMeasurement;
}
}
< /code>
Any insights into why the initial load remains so slow would be greatly appreciated.
Подробнее здесь: https://stackoverflow.com/questions/796 ... en-with-db
Необычно длительное начальное время загрузки в приложении Blazor Server с EF Core, даже при разминке DBContext ⇐ C#
-
Anonymous
Необычно длительное начальное время загрузки в приложении Blazor Server с EF Core, даже при разминке DBContext
Я работаю над простым проектом по изучению Blazor Server и EF Core, частично генерируемого помощником искусственного интеллекта. Я заметил, что конкретная тестовая страница, хотя и не сложная, имеет очень длинное начальное время загрузки (около 8 секунд). Такая задержка была бы неприемлемой в реальном коммерческом проекте. Вот что я нашел:
Мобильная версия