本シリーズのまとめはこちらにあります。
前回は約 6 年前の PC と、現役世代のマシンとで、.NET Core のアプリケーションのビルド速度を比較してきました。 その結果、 PC の最新化によってかなりビルド速度が高速化できることがわかりました。
今回は、比較的新しめの Intel 系 CPU と AMD 系 CPU の比較をしてみようと思います。 例によって CPU 以外にも異なる点が多々ある環境で比較しますので、 CPU の性能差以外にも影響を与えている可能性は十分に考えられます。 できる限り比較する PC のスペックを記載しますので、数値を見る際は、環境の差異にも注意してお読みいただければと思います。
環境
今回比較する 2 台のマシンは以下の通りです。 他にもいろいろ違う点はありますが、検証内容と関係ないものは記載を省いています。
項目 | 9th Core i7 構成 | Zen3 Ryzen 構成 |
---|---|---|
CPU | Intel Core i7 9700K | AMD Ryzen 9 5900X(PBO は有効に設定) |
メモリ | DDR4 8GB × 2枚(2666MHz) | DDR4 32GB × 2枚(3200MHz) |
記憶装置 | 1TB NVMe M.2 SSD(PCIe 3.0) | 1TB NVMe M.2 SSD(PCIe 4.0) |
マザーボード | ASUS TUF Z390-PLUS GAMING | MSI B550 TOMAHAWK |
CPUクーラー | Nocture NH-U12A | Nocture NH-D15 |
ちなみにこれらの CPU の Cinebench R23 におけるベンチマークを以下に貼っておきます。
項目 | Intel Core i7 9700K | AMD Ryzen 9 5900X |
---|---|---|
Multi Core | 9,214 | 21,878 |
Single Core | 1,246 | 1,622 |
前回比較した Core i7 4790K から大幅にスペックアップしたCPU です。 Single Core のスコアが約 20 %、 Multi Core のスコアが 約 87 %向上しています。 Core i7 9700K は 8 コア 8 スレッド、 Ryzen 9 5900X は 12 コア 24 スレッドで、 Multi Core に大きな性能差があるのは仕方がない面もあります。 またSingle Core のスコアにも大きな差があります。 Core i7 9700K は 2018 年 4Q に発売、対する Ryzen 9 5900X は 2020年 4Q 発売と、 2 年ほど Ryzen 9 5900X のほうが新しい CPU です。
検証内容
検証は .NET 5 のアプリケーションをビルドし、ビルド時間を比較する方法で行います。 対象のソースコードは、 2021 年 5 月初旬に取得したものを使用します。 前回の記事とは異なる時期に取得したソースコードです。 各アプリケーションは、 NuGet パッケージを参照しているため、事前にパッケージをすべてローカルにダウンロードした状態でビルドを行います。 ローカルファイル内にパッケージがあれば、ダウンロードする処理は行われないため、ネットワークの影響を限りなく無視することができます。
今回検証の対象となるアプリケーションは、以下の 2 つを利用します。
eShopOnWeb
こちらはマイクロソフト社が開発している .NET Core のリファレンスとなるアプリケーションです。 リファレンスとして使用するもので、プロジェクトの数も 9 つしかありません。
Entity Framework Core
.NET Core で使用できる代表的な O/R マッパーです。 こちらはそれなりに規模が大きく、 46 プロジェクトで構成されています。
検証手順
eShopOnWeb
上述のリポジトリからソースコード一式を取得します。 取得したディレクトリをカレントディレクトリに設定し、コマンドプロンプトから以下のコマンドを実行します。
dotnet restore eShopOnWeb.sln
これで NuGet パッケージをローカルにダウンロードできます。 続いて、 CPU がアイドル状態になり、温度も一定になったことを確認してから、以下のコマンドを実行します。
dotnet build eShopOnWeb.sln
実行すると、実行時間が最後に表示されるので、その時間を記録します。 この作業を各環境で 7 回ずつ実行します。
Entity Framework Core
上述のリポジトリからソースコード一式を取得します。 取得したディレクトリをカレントディレクトリに設定し、コマンドプロンプトから以下のコマンドを実行します。
restore.cmd
これで NuGet パッケージをローカルにダウンロードできます。 続いて、 CPU がアイドル状態になり、温度も一定になったことを確認してから、以下のコマンドを実行します。
build.cmd
実行すると、実行時間が最後に表示されるので、その時間を記録します。 この作業を各環境で 7 回ずつ実行します。
検証結果
eShopOnWeb のビルド時間
Entity Framework Core のビルド時間
結果を見てみましょう。 プロジェクト数の少ない eShopOnWeb の方は、わずかに Ryzen 9 5900X のほうがビルド時間は短いものの、平均時間で 0.12 秒の差しかなく、ほとんど誤差レベルの差しかありません。 それに対して Entity Framework Core の方は、平均時間で約 9.4 秒の差が出ており、圧倒的に Ryzen 9 5900X のほうが早いと言えます。
考察
正直ここまではっきり差がつくとは思ってもいませんでした。 昔からプログラム開発やビルド作業には、シングルスレッドの処理性能が重要であると言われてきました。 しかし、このレベルまで進化した CPU *1では、ベンチマーク上の差はあっても、シングルスレッドの性能差がこれほど大きくビルドの実行時間に対して影響を与えるとは考えられません。
こう考察する理由に、ビルド実行時の CPU 使用率があります。 実はこれらのアプリケーションのビルドを行っているとき、 CPU 使用率はほとんどの時間で 100% になりません。 これはコア単位で見たときも同様で、すべてのコアがほとんどの時間、 70% ~ 90% で推移することが見て取れます。 100% になるのはほんの一瞬の時間しかありません。 シングルスレッドの処理性能が重要なのだとしたら、いくつかのコアが 100% に張り付くような現象が起こるはずです。 しかし、こういった現象は、どちらの CPU も一切確認できませんでした。 そう考えると、今の時代のビルド環境には、シングルスレッドの処理性能を追求することより、コアの数を増やす方が効果的であるという仮説が立てられそうです。
なお規模の小さい eShopOnWeb プロジェクトは、プロジェクト数が少なかったため、コア数の恩恵をあまり受けられなかったことで、時間にそれほど差がつかなかったと考えることができそうです。
まとめ
今回は Intel Core i7 9700K と AMD Ryzen 9 5900X のマシンで、.NET Core のアプリケーションをビルドする時間の比較と考察を行いました。 その結果、昨今のビルド作業では、 CPU のシングルスレッド性能を追求するより、コア数の多い CPU を選択したほうが幸せになれる可能性が高いことを確認しました。 なかなか興味深い結果になったと思います。
次回は、今回浮かび上がった「ビルドにはコア数を増やす方が効果的」という仮説を検証するため、 Ryzen 9 5900X の上に Hyper-V で仮想マシンを立ち上げ、割り当てるコアの数を増減させてビルド時間を検証してみます。 果たしてどんな結果になるのか。。。
*1:例えばモバイル用 CPU とデスクトップ CPU など、用途や使われ方が全く異なるものを持ってくれば確実に差は出ると思いますが。