控制台应用程序和 Web api 之间的 EF Core 执行时间

问题描述 投票:0回答:1

任何人都可以解释为什么控制台应用程序之间存在巨大的执行时间,执行时间不到一秒,而 API 则需要几分钟。还能改进吗

我正在使用.net 7

网络应用程序

var builder = WebApplication.CreateBuilder(args);

var cnn = new SqliteConnection("Data Source=EmployeeCacheStore;Mode=Memory;Cache=Shared");
cnn.Open();

builder.Services.AddDbContext<DataContext>(options => options.UseSqlite(cnn));

var app = builder.Build();

app.MapGet("/weatherforecast", (DataContext context1) =>
{
    var time = Stopwatch.GetTimestamp();
    context1.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    context1.ChangeTracker.AutoDetectChangesEnabled = false;

    var list = Enumerable.Range(1, 8000).Select(x => new Record() { Id = x }).ToList();
    context1.Record.AddRange(list);
    context1.SaveChanges();

    return $"Executed in: {Stopwatch.GetElapsedTime(time)}";
}).WithName("GetWeatherForecast");

app.Run();

控制台:

var conn = new SqliteConnection("Data Source=EmployeeCacheStore;Mode=Memory;Cache=Shared");
conn.Open(); 
var options = new DbContextOptionsBuilder<DataContext>().UseSqlite(conn).Options;

using (var ctx = new DataContext(options))
{
    var time = Stopwatch.GetTimestamp();
    ctx.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    ctx.ChangeTracker.AutoDetectChangesEnabled = false;
    var list = Enumerable.Range(1, 8000).Select(x => new Record() { Id = x }).ToList();
    ctx.Records.AddRange(list);
    ctx.SaveChanges();

    Console.WriteLine("Executed in: {0}", Stopwatch.GetElapsedTime(time));
}

背景:

public class Record
{
    public int Id { get; set; }
    public string? Name { get; set; }
}

public class DataContext : DbContext
{
    public DbSet<Record> Records { get; set; }

    public DataContext(DbContextOptions options) : base(options)
    {
        Database.EnsureCreated();
    }
}
c# .net entity-framework asp.net-core
1个回答
0
投票

调试:

  • 网页:执行时间:00:00:10.0011561
  • 控制台:执行时间:00:00:00.4682114

在最新版本的 .NET / EF Core 中,(.NET 6+) EF 日志记录在开发中默认启用。

在调试模式下执行需要 10 秒的原因是因为这是在执行期间将大约 24k 行日志记录到控制台所需的时间。

您可以通过删除日志记录来加快速度:

builder.Logging.ClearProviders();

//output Web: Executed in: 00:00:00.3051866

或通过在 appsettings.Development.json 中配置日志级别来减少详细程度(可重现示例中未提供)

或在发布模式下运行您的应用程序

发布:

  • 网页:执行时间:00:00:00.5546975
  • 控制台:执行时间:00:00:00.2601217
© www.soinside.com 2019 - 2024. All rights reserved.