配列要素コピー速度比較検証(c++)

はじめに

ここ最近比較的C++のコードを書く機会が多く、 メモリコピーの際にどの書き方が早いのか実際どうなるか試したことがなかったで検証してみました。

参考になれば幸いです。

検証

検証環境

  • OS: Windows10 Pro 2004
  • CPU: Ryzen3950X
  • メモリ: 64GB

検証内容

ゲーム系でfloat型3値のVector3を扱うことが多いので、 こちらのデータを1000万個のコピーする速度を見ました。

配列のnewなどは面倒だったのでvectorで事前に配列のデータはある状態となっています。

またこの界隈でよく聞くforループの際のi++よりも++iが早い、というのも合わせて試してみようと思います。

検証結果

vector
i++
vector
++i
pointer
i++
pointer
++i
loop ref
i++
loop ref
++i
memcpy
Debug 765.7022 779.0071 50.7569 44.6103 273.6087 277.0462 7.9078
Release 15.3483 14.8346 14.1941 15.1834 15.0048 15.4803 8.2762

Debugの状態だとポインタを使った参照を使うことで非常に高速化されました。 これはおそらくvectorのデバッグチェック処理を挟まないために高速化されたんでしょうね。

Releaseにすると全体的に同じ程度の実行速度という結果となりました。 驚きなのはmemcpyはDebug,Releaseともにほぼ処理時間が同じということです。 ※Releaseの方が遅く見えるのは誤差です。 memcpyってこんなに優秀だったんですね...。

またi++,++iに関しては結果からは有意な差がでませんでした。 1000万回程度じゃ大した差にならないのか、それともキャッシュの問題で差が平均化されてしまったのか...。

結論

Debug,Releaseともにmemcpyが最も高速

個人的には何でもかんでもmemcpyを使うとメモリ破壊したときに頭を抱えることになりそうなので、 複雑な処理の部分では避けたりネックになる部分に絞って使用するのがよさそうです。

参考 検証に使用したソース