⚙
.NET9でORMをベンチマークしてみた。
はじめに
.NET 9における.NETのORMについて検証します。
といっても、.NETでORMというともうEntity Framework CoreかDapperくらいしかないです。
なので、標準のSqlCommandとDapperとEFCoreを比べます。
検証コードは以下にあります。
検証条件
.NET 9に絞ります。また、対象の処理はSELECT、対象のデータは AdventureWorks サンプル データベース - SQL Server | Microsoft Learn のデータを活用します。
対象テーブルは DimCustomer
とします。データ件数が18000件ほどあります。
このデータを単純にSELECTする処理でのベンチマークを測ります。
ベンチマーク結果
以下にDotnetBenchの出力結果を示します。
BenchmarkDotNet v0.14.0, Windows 11 (10.0.26100.2894)
Unknown processor
.NET SDK 9.0.200
[Host] : .NET 9.0.2 (9.0.225.6610), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI [AttachedDebugger]
Runtime=.NET 9.0 Concurrent=True Server=True
Toolchain=InProcessEmitToolchain IterationCount=10 WarmupCount=3
Method | Mean | Error | StdDev | Min | Max | Median | Rank | Gen0 | Gen1 | Gen2 | Allocated |
---|---|---|---|---|---|---|---|---|---|---|---|
'EntityFramework Core (from SQL) - SELECT' | 42.55 ms | 2.370 ms | 1.567 ms | 40.28 ms | 44.69 ms | 42.60 ms | 1 | 500.0000 | - | - | 4.89 MB |
'EntityFramework Core (from Model) - SELECT' | 43.75 ms | 2.290 ms | 1.515 ms | 41.48 ms | 45.49 ms | 43.99 ms | 1 | 500.0000 | - | - | 4.88 MB |
'SqlCommand - SELECT' | 61.44 ms | 7.153 ms | 4.731 ms | 53.26 ms | 66.82 ms | 63.66 ms | 2 | 2900.0000 | 2800.0000 | 1100.0000 | 18.19 MB |
'Dapper - SELECT' | 73.71 ms | 3.996 ms | 2.643 ms | 69.11 ms | 76.82 ms | 73.85 ms | 3 | 3750.0000 | 3625.0000 | 1125.0000 | 21.86 MB |
Entity Framework Coreが圧倒的に早いという結果になりましたね。
おわりに
検証ではEntity Framework Coreを使ったほうが処理速度としてはもっとも優秀という結果になりました。もちろん、処理速度だけが技術選定の条件とは言えないですが、大きな差をつけている点で、ひとまず、.NETではEntity Framework Coreを選んでおけば問題ないということがいえるのかなと思います。
今回はSELECTしか検証していないので、時間ができたタイミングでCRUDすべて検証してどうなのか見てみたいと思います。
Discussion
もしかしてですが EF Core のテストは GlobalSetup で DbContext を一回だけ作っているので、DbContext にキャッシュされている可能性はないでしょうか? DbContext を使いまわす場合でも
AsNoTracking
を指定したりすると変わるかもしれません。