きっかけ
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しておきました。