.NET9でORMをベンチマークしてみた。

2025/02/16に公開1

はじめに

.NET 9における.NETのORMについて検証します。

といっても、.NETでORMというともうEntity Framework CoreかDapperくらいしかないです。

なので、標準のSqlCommandとDapperとEFCoreを比べます。

検証コードは以下にあります。

https://github.com/neko3cs/neko3cs-lab/tree/main/src/dotnet-benchmark-orm

検証条件

.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

Mayuki SawatariMayuki Sawatari

もしかしてですが EF Core のテストは GlobalSetup で DbContext を一回だけ作っているので、DbContext にキャッシュされている可能性はないでしょうか? DbContext を使いまわす場合でも AsNoTracking を指定したりすると変わるかもしれません。