DotNET SDKのAOTを比較してみた

きっかけ

STSだけれどもDotNET9もでたことですし、MacでもAOTビルドできるようになった(ver8)と気になる感じが自分的にたかまってきたので軽く検証してみました。

主に

  • ビルドサイズ
  • 実行速度
  • 起動速度

に絞って調べてみました。

準備

プロジェクトファイルの設定で各バージョンSDKを指定してビルドしてもいいのですが、

影響を切り分けるためにasdfでディレクトリ単位で異なるバージョンのSDKをインストールして検証しました。

具体的にはこんな感じでセットアップしました。

brew install asdf

asdf install dotnet 6.0.428
asdf install dotnet 7.0.410
asdf install dotnet 8.0.404
asdf install dotnet 9.0.101

cd dotnet6
asdf local dotnet 6.0.428
cd - 

cd dotnet7
asdf local dotnet 7.0.410
cd -

cd dotnet8
asdf local dotnet 8.0.403
cd -

cd dotnet9
asdf local dotnet 9.0.101
cd -

ベンチマーク実施

まずディレクトリごとに.projファイルにビルドオプションを設定しておき、そこにベンチマークのプログラムファイルをコピーして

build&publishするようにしました。

ひとまず今回は負荷が調節しやすい最適化しない感じの素数をもとめるコードにしました。

ビルド後にそれぞれのバイナリのサイズを確認したのち、起動時間も測りたいためtimeコマンドで計測しました。

具体的にはこのようなrun_bench.shを作成して、

#/bin/bash -eu

wc -c dotnet6/bin/Release/net6.0/osx-arm64/publish/prime_num 
wc -c dotnet7/bin/Release/net7.0/osx-arm64/publish/prime_num
wc -c dotnet8/bin/Release/net8.0/osx-arm64/native/prime_num
wc -c dotnet9/bin/Release/net9.0/osx-arm64/native/prime_num

MAX_NUM=${MAX_NUM:-1000000}

time dotnet6/bin/Release/net6.0/osx-arm64/publish/prime_num $MAX_NUM
time dotnet7/bin/Release/net7.0/osx-arm64/publish/prime_num $MAX_NUM
time dotnet8/bin/Release/net8.0/osx-arm64/native/prime_num $MAX_NUM
time dotnet9/bin/Release/net9.0/osx-arm64/native/prime_num $MAX_NUM

こんなかんじで実行しました。

./build.sh &&  (./run_bench.sh 2>&1) > result_bench.txt

結果

サイズ

やはりAOTオプション(PublishAot)が使えるバージョンからぐっとファイルサイズが小さくなりました。

とくにver9はサイズが約12%になっているようです。

ユーザコードが少ない条件のせいかやはり大きな差がでました。

# このようなコマンドでサイズ確認 wc -c dotnet6/bin/Release/net6.0/osx-arm64/publish/prime_num


 12224608 dotnet6/bin/Release/net6.0/osx-arm64/publish/prime_num
 12327952 dotnet7/bin/Release/net7.0/osx-arm64/publish/prime_num
 2831864 dotnet8/bin/Release/net8.0/osx-arm64/native/prime_num
 1417416 dotnet9/bin/Release/net9.0/osx-arm64/native/prime_num

行速度

予想に反してむしろver6が若干速いという結果に。

もしかしたらLinQなどのほかの機能も使ったら大きく異なるのかもしれないです。

# 1000000までの素数の個数を調べ終わるまでにかかった時間

dotnet6 24.079s
dotnet7 27.814s
dotnet8 27.562s
dotnet9 31.736s

起動速度

ベンチマークをすぐ終わる設定で実行して比較。

これはやはりAOTが使えるver8や9がやはり有利。

AOTなしの頃に比べ12%程度に起動時間が短縮しているもよう。

# 10までの素数の個数を調べ終わるまでにかかった時間

dotnet6 0.092s
dotnet7 0.110s
dotnet8 0.016s
dotnet9 0.014s

使ったコード

ビルド設定なども含めて こちら にUPしておきました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です