Необычно длительное начальное время загрузки в приложении Blazor Server с EF Core, даже при разминке DBContextC#

Место общения программистов C#
Ответить
Anonymous
 Необычно длительное начальное время загрузки в приложении Blazor Server с EF Core, даже при разминке DBContext

Сообщение Anonymous »

Я работаю над простым проектом по изучению Blazor Server и ef core , частично сгенерированный помощником ИИ. Я заметил, что конкретная тестовая страница, хотя и не сложная, имеет очень длинное начальное время загрузки (около 8 секунд). Такая задержка была бы неприемлемой в реальном коммерческом проекте. Вот что я нашел: < /p>
Без разминки DBContext: Загрузка первой страницы занимает ~ 8,1 секунды. Тем не менее, загрузка первой страницы по -прежнему занимает ~ 7,8 секунды. < /P>
Это не кажется правильным. Похоже, что нагревание DBContext практически не влияет на воспринимаемое пользователем время начальной загрузки. Насколько я понимаю, что компиляция модели EF Core была основной частью холодного старта, но мои результаты предполагают, что существует еще одна узкая часть аналогичной величины.
Мой вопрос :
Это длинное начальное время нагрузки (~ 8 секунд) нормальным для получения нанесения нанесения нанесения нанесения нанесения Blazor Server, даже после того, как Dbcontextextext был вновным? Если нет, то что может быть узким местом? Это сама фреймворк Blazor, настройка подключения SignalR или что-то еще, что мне не хватает?

Код: Выделить всё

// 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();
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
{
[list]
@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()
{
// ... loads posts from DbContext ...
}
}
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;
}
}
Любое понимание того, почему начальная нагрузка остается настолько медленной, была бы очень оценена.

Подробнее здесь: https://stackoverflow.com/questions/796 ... en-with-db
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»