Без разминки 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();
Код: Выделить всё
@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 ...
}
}
Код: Выделить всё
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
Мобильная версия