Xamarin.Android アプリケーションの起動が遅いという問題に直面しました。
最初の DbContext の作成には約 4.5 秒かかります(コンテキストには 24 個のテーブルがあります)。最初は、これの理由は、EF Core が DbContext からエンティティ クラスをスキャンしてモデルを構築するのに時間がかかるためだと思いました (これは、大規模な DbContext では理にかなっています)。
そのため、モデルを作成する時間とモデル内のテーブル数との関係を確認するために、テーブルが 1 つだけのテスト 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; }
}
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();
このコードの実行には、Samsung Galaxy S7 で3.3 秒かかります。このテストは、いくつかの解決策を試すことの不適切さを示しました。
- 使用するエンティティ クラスの数を減らす (テーブル間の接続を減らす)。
- 1 つのアプリケーション DbContext をいくつかの小さなコンテキストに分割します。
また、次のことも学びます。
- EF Core には自動移行機能がありません (無効にする必要はありません)。
- コード ファーストのアプローチを削除しましたが、DbContext の初期化時間を 4 秒に短縮するのに部分的にしか役立ちませんでした。
- この行を ConfirmCreated で削除すると、最初のリクエストの実行時間が同じ時間だけ増加します。
- 似たような問題はたくさんありますが (ここでは 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 がある場合 (1 つ目は 1 つのエンティティ、2 つ目は 25 エンティティ)、2 つ目のコンテキストの EF Core の初期化時間は1 秒以内に大幅に短縮されます。最初のコンテキストの初期化はまだ遅いです。
- デバッグ セッションが接続されていない場合、初期化はより速く (~30%) 完了します。
EF Core 5 Preview 6 GitHubの例
この初期化時間をどうにかしてユーザーから隠し、メイン アクティビティのデータを取得するには、どのような方法を使用できますか?
デフォルト構成の初期化時間を増やすのに役立つ構成のヒントはありますか?
.NET 5 を実行するとパフォーマンスは向上しますか?