配列要素コピー速度比較検証(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を使うとメモリ破壊したときに頭を抱えることになりそうなので、 複雑な処理の部分では避けたりネックになる部分に絞って使用するのがよさそうです。
参考 検証に使用したソース