EF Core SQLite 在 Xamarin 上启动性能缓慢

Pav*_*vel 6 sqlite xamarin.android xamarin ef-core-2.2 ef-core-5.0

我的 Xamarin.Android 应用程序启动缓慢。

第一次 DbContext 创建需要大约 4.5 秒(上下文有 24 个表)。一开始我以为这样做的原因是EF Core需要时间从DbContext扫描实体类并构建模型(这对于大型DbContext是有意义的)。

因此,我创建了一个只有一张表的测试 DbContext 来检查创建模型的时间与模型中表的数量之间的关系:

public class Log
{
    [Key]
    public int EntityId { get; set; }
    public string Timestamp { get; set; }
    public string Level { get; set; }
    public string Exception { get; set; }
    public string RenderedMessage { get; set; }
    public string Properties { get; set; }
}

public class ApplicationLogDbContext : DbContext
{
    public ApplicationLogDbContext(DbContextOptions<ApplicationLogDbContext> options)
        : base(options) { }

    public DbSet<Log> Logs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

DbContext 测试代码:

var options = new DbContextOptionsBuilder<ApplicationLogDbContext>()
    .UseSqlite("Data Source=/storage/emulated/0/Android/data/***/files/ApplicationLog.db")
    .Options;
var logContext = new ApplicationLogDbContext(options);
logContext.Database.EnsureCreated();
Run Code Online (Sandbox Code Playgroud)

这段代码在我的三星 Galaxy S7 上执行需要3.3 秒。这个测试表明尝试一些解决方案是不合适的:

  • 使用更少的实体类(减少表之间的连接);
  • 将一个应用程序 DbContext 拆分为几个小上下文。

我还了解到:

  • EF Core 没有自动迁移(我不需要禁用它);
  • 我删除了代码优先方法,但它只能部分帮助将 DbContext 初始化时间减少到 4 秒;
  • 如果我用EnsureCreated删除那一行,第一个请求的执行时间也会同时增加;
  • 有很多类似的问题(这里,GitHub),但他们没有解决方案。甚至 EF6 也报告了此类问题;
  • 安装 Microsoft.EntityFrameworkCore.Sqlite 5.0.0-preview.6.20312.4 后我没有注意到任何重大变化(应用程序具有相同的执行时间:~ 3.3 秒);
  • PRAGMA journal_mode=WAL; 提高初始化速度(EF Core 2.2)。这并不稳定,但有时初始化时间会减少 300-400 毫秒。
  • 如果应用程序具有用于不同数据库的 2 个 DbContext(第一个具有一个实体,第二个具有 25 个实体),则第二个上下文的 EF Core 初始化时间将大大减少到~1 秒。第一个上下文初始化仍然很慢;
  • 在没有附加调试会话的情况下,初始化完成得更快 (~30%)。

EF Core 5 Preview 6 GitHub示例

在此处输入图片说明 在此处输入图片说明

我可以使用什么方法以某种方式向用户隐藏此初始化时间,但获取主要活动的数据?

有没有什么配置提示可以帮助增加默认配置初始化时间?

运行 .NET 5 时性能会提高吗?