ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。

メモリの速度は.NETアプリケーションのビルド時間に影響を与えるのか

f:id:masatsuna:20210608201002p:plain

Ryzen シリーズの特徴として、メモリの速度が重要であると言われてきました。 様々なベンチマーク結果を見る限り、メモリの速度を上げることで、 CPU の処理性能を向上させることができているようです。 では実際の .NET アプリケーションのビルドというユースケースにおいて、メモリの速度がどの程度の影響を及ぼすのか調査してみた、というのが今回の趣旨となります。

環境

今回検証に使用するマシンは以下の通りです。

項目
CPU AMD Ryzen 9 5900X(PBO は自動に設定)
メモリ DDR4 32GB × 2枚(3200MHz)デュアルランク
記憶装置 1TB NVMe M.2 SSD(PCIe 4.0)
マザーボード MSI B550 TOMAHAWK
CPUクーラー Nocture NH-D15

この PC に対して、 BIOS でメモリの動作速度を変更し、その影響を確認します。 メモリ速度は、このメモリの SPD に記録されていた 2133MHz と、 Ryzen 9 5900X のサポートする最大値である 3200MHz を使用します。 3200 MHz の方は、XMP に入っている設定をそのまま使用します。 詳細は以下の通りです。

項目 SPD 設定 OC(XMP) 設定
速度 2133 MHz 3200 MHz
モリタイミング 15-15-15-36 16-20-20-38
電圧 1.2V 1.35V

なお使用しているメモリは以下のものです。


検証内容

検証は .NET 5 のアプリケーションをビルドし、ビルド時間を比較する方法で行います。 対象のソースコードは、 2021 年 5 月下旬に取得したものを使用します。 各アプリケーションは、 NuGet パッケージを参照しているため、事前にパッケージをすべてローカルにダウンロードした状態でビルドを行います。 ローカルファイル内にパッケージがあれば、ダウンロードする処理は行われないため、ネットワークの影響を限りなく無視することができます。

今回検証の対象となるアプリケーションは、以下の 2 つを利用します。

eShopOnWeb

github.com

こちらはマイクロソフト社が開発している .NET Core のリファレンスとなるアプリケーションです。 リファレンスとして使用するもので、プロジェクトの数も 9 つしかありません。

Entity Framework Core

github.com

.NET Core で使用できる代表的な O/R マッパーです。 こちらはそれなりに規模が大きく、 46 プロジェクトで構成されています。

検証手順

eShopOnWeb

上述のリポジトリからソースコード一式を取得します。 取得したディレクトリをカレントディレクトリに設定し、コマンドプロンプトから以下のコマンドを実行します。

dotnet restore eShopOnWeb.sln

これで NuGet パッケージをローカルにダウンロードできます。 続いて、 CPU がアイドル状態になり、温度も一定になったことを確認してから、以下のコマンドを実行します。

dotnet build eShopOnWeb.sln

実行すると、実行時間が最後に表示されるので、その時間を記録します。 この作業を各環境で 8 回ずつ実行します。

Entity Framework Core

上述のリポジトリからソースコード一式を取得します。 取得したディレクトリをカレントディレクトリに設定し、コマンドプロンプトから以下のコマンドを実行します。

restore.cmd

これで NuGet パッケージをローカルにダウンロードできます。 続いて、 CPU がアイドル状態になり、温度も一定になったことを確認してから、以下のコマンドを実行します。

build.cmd

実行すると、実行時間が最後に表示されるので、その時間を記録します。 この作業を各環境で 6 回ずつ実行します。

検証結果

eShopOnWeb のビルド時間

f:id:masatsuna:20210606074104p:plain

Entity Framework Core のビルド時間

f:id:masatsuna:20210606074117p:plain

結果を見てみましょう。 平均値で見比べると、やはりメモリの速度を上げることで、処理性能を引き出すことができるようです。 これまでの検証結果とも同じ傾向で、規模の小さなプロジェクトの場合はあまり影響を受けず、規模が大きくなるほど影響が大きくなります。

考察

今回はメモリの動作速度にだけ注目して検証を行いました。 Ryzen はメモリの動作速度が PC 全体のパフォーマンスに影響を与える、という説は、ここでも実証された形になります。

一般的にプログラムをコンパイルするという処理は、メモリを大量に使って処理を進める傾向にあります。 そのため、メモリのスピードを変更しただけでも、明らかにスピード差が生まれているものと推測します。 とはいえ、 CPU の差ほど大きな差がつくわけではないため、コストをかけるのであれば、まずは CPU を強化し、メモリは後回し、という考え方はいつも通り成り立つものと思います。

いずれにせよメモリの速度を上げることで、ビルド時間を多少でも短縮することができますので、チャレンジしてみる価値はあると思います。 なお私の PC に搭載しているメモリは、 3200MHz が最高設定ということになっているので、これ以上のオーバークロックは試していません*1。 メモリのオーバークロックによる効果も気になるところではありますが、今回の結果を見る限り、あまり大きな差は出ないものと思われます。

まとめ

今回は、メモリの速度が .NET アプリケーションのビルド時間にどの程度の影響を与えるか検証してきました。 CPU 程ではないにせよ、メモリの速度を上げることで、 .NET アプリケーションのビルド時間を短縮する効果が確認できました。 メモリの速度調整は、 XMP のおかげで比較的簡単に実施できます。 無理のない範囲でメモリ速度のチューニングを行ってみるのもよいかもしれませんね。

というわけで、今回で .NET アプリケーションのビルド時間を検証する企画は終了です。 個人的に気になるデータをいろいろ収集できて満足でした。

*1:いまはメモリも高いですし、壊したくないです。