任何人都可以解释为什么控制台应用程序之间存在巨大的执行时间,执行时间不到一秒,而 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();
}
}
调试:
在最新版本的 .NET / EF Core 中,(.NET 6+) EF 日志记录在开发中默认启用。
在调试模式下执行需要 10 秒的原因是因为这是在执行期间将大约 24k 行日志记录到控制台所需的时间。
您可以通过删除日志记录来加快速度:
builder.Logging.ClearProviders();
//output Web: Executed in: 00:00:00.3051866
或通过在 appsettings.Development.json 中配置日志级别来减少详细程度(可重现示例中未提供)
或在发布模式下运行您的应用程序
发布: