noxi雑記

.NET、Angularまわりの小ネタブログ

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が持つ高いポテンシャルを窺うことができますが、全てにおいてパフォーマンスが良いわけでは無いようです。