ASP.NET と ASP.NET Core のパフォーマンスを比較する(WebAPI)
仕事でASP.NETを使用してWebアプリを作る時に同期のメソッドを使うよりもasync/await使った方がパフォーマンスが良いよとか、ASP.NETよりもASP.NET Coreの方がパフォーマンスが良いよとか周りに言いふらしながら作っています。しかしどの程度違うのかちゃんと実際に調べたことが無かったため、弊部署でよくある ASP.NET + EF6 と ASP.NET Core 2.0 + EFCore 2.0 の組み合わせでどの程度パフォーマンス差があるのか調べて見ました。
TL;DR
ASP.NET Coreは従来のASP.NETと比較してパフォーマンスが良いと言われていますが、デフォルトの設定で使用する場合、非常にシンプルな環境ではASP.NET Coreの方がかなり遅いようです。うーん。。。
方法
簡単なデータベースの中身を返すWebAPIを作成し、ApacheBenchでレスポンスにかかる時間や秒間あたりのレスポンス数を調べます。今回の調査では ab -n 5000 -c 100 URL
としました。実際に返るレスポンスサイズは8KB程度です。
EntityFrameworkでデータを取得する際にNoTrackingを使用する場合としない場合、async/awaitを利用する場合と利用しない場合のそれぞれについても計測を行います。
環境
- Azure App Service (S1/S3)
- Azure Database (S2 Standard = 50DTUs)
- ApacheBench 2.3 (Ubuntu Server 16.04 / D4s v3)
- ASP.NET 5.2.4 + EntityFramework 6.2.0
- ASP.NET Core 2.0.5 (EntityFrameworkCore 2.0.1)
結果
AppService (S1)
1リクエストあたりの平均レスポンス時間(ミリ秒)
ASP.NET (sync) | ASP.NET (async) | ASP.NET Core (sync) | ASP.NET Core (async) | |
---|---|---|---|---|
Tracking | 823.200 | 1065.054 | 1188.158 | 1451.577 |
NoTracking | 842.848 | 833.315 | 1076.202 | 1194.474 |
秒間あたりの平均レスポンス数
ASP.NET (sync) | ASP.NET (async) | ASP.NET Core (sync) | ASP.NET Core (async) | |
---|---|---|---|---|
Tracking | 121.48 | 93.89 | 84.16 | 68.89 |
NoTracking | 118.65 | 120.00 | 92.92 | 83.72 |
※ 両者ともAppService PlanのCPUはほぼ100%張り付き、データベースのDTUは40%程度。
AppService (S3)
1リクエストあたりの平均レスポンス時間(ミリ秒)
ASP.NET (sync) | ASP.NET (async) | ASP.NET Core (sync) | ASP.NET Core (async) | |
---|---|---|---|---|
Tracking | 282.408 | 259.043 | 352.028 | 484.315 |
NoTracking | 232.157 | 234.545 | 308.042 | 407.036 |
秒間あたりの平均レスポンス数
ASP.NET (sync) | ASP.NET (async) | ASP.NET Core (sync) | ASP.NET Core (async) | |
---|---|---|---|---|
Tracking | 354.10 | 386.04 | 284.07 | 206.48 |
NoTracking | 430.74 | 426.36 | 324.63 | 245.68 |
※両者ともAppService PlanのCPUは90%程度、データベースのDTUは60%程度。
まとめ
今回はシンプルなWebAPIのみのWebアプリを作って計測してみましたが、非常に負荷がかかる状態ではASP.NETの方がかなりパフォーマンスが良いようです。またasync/awaitを使用すると、ASP.NETでは大きな違いは無いが、ASP.NET Coreでは使用しない場合と比較してかなりパフォーマンスが低下しています。この辺りを見るとASP.NET Coreが持つ高いポテンシャルを窺うことができますが、全てにおいてパフォーマンスが良いわけでは無いようです。