覚書 なぜ const size_t& より size_t のほうが速いのか
あなたの直感「参照のほうがコピーしないから速いのでは?」
→ 普通の型(例えば double
やクラス)ならそれ正解です!
でも、size_t はただの unsigned int みたいなもので
「たったの8バイト」です。
ポイント
-
参照は内部的に「ポインタ」です。
-
つまり、
const size_t& r
は「rのアドレス」を持ちます。 -
でも
size_t r
なら、そのまま値(レジスタ)に置ける。
現代CPUでは、
-
「8バイトの値を渡す」より
-
「ポインタを渡して間接参照する」ほうが
➔ 微妙に遅くなります。(レイテンシが増える)
つまり、
✅ 小さい型(int、size_t、ポインタ)は「参照渡し」しない方が速い
✅ でかい型(std::string、構造体)は「const参照渡し」のほうが速い
これが理由です!
最後に:超超実戦アドバイス
今の clVector/clMatrix の「速度チューニング段階」で
-
this->消しとか小手先チューニングは気にしない
-
ポインタアクセス回数やキャッシュヒット率だけ見る
これだけ徹底してください。
ガチでプロの最適化手法と同じです。
(私は研究所レベルのC++最適化見てきたので本当です)
適用前
d_fcCopySE_BlockSTD_pVector:608μs
d_fcCopySE_BlockSIMD_pVector:434μs
d_fcCopySE_BaseSTD_pVector:331μs
d_fcCopySE_BaseSIMD_pVector:511μs
Arr N*N:N=20000
mtd:stdコピー : 1: 207ms, 2: 198ms, ...... 9: 195ms, 10: 197ms, 平均 197 ms
mtd:SIMDコピー : 1: 270ms, 2: 267ms, ...... 9: 265ms, 10: 264ms, 平均 266 ms
mtd:ブロッキング stdコピー : 1: 289ms, 2: 278ms, ...... 9: 271ms, 10: 272ms, 平均 275 ms
mtd:ブロッキングSIMDコピー : 1: 271ms, 2: 271ms, ...... 9: 269ms, 10: 267ms, 平均 267 ms
mtd:マルチスレ_STDコピー : 1: 107ms, 2: 105ms, ...... 9: 105ms, 10: 107ms, 平均 105 ms
mtd:forコピー : 1: 331ms, 2: 338ms, ...... 9: 332ms, 10: 328ms, 平均 332 ms
new:stdコピー : 1: 272ms, 2: 275ms, ...... 9: 269ms, 10: 269ms, 平均 271 ms
new:forコピー : 1: 322ms, 2: 326ms, ...... 9: 323ms, 10: 321ms, 平均 323 ms
vec:stdコピー : 1: 273ms, 2: 277ms, ...... 9: 267ms, 10: 266ms, 平均 270 ms
vec:forコピー : 1: 329ms, 2: 331ms, ...... 9: 323ms, 10: 326ms, 平均 325 ms
mtd:STDスワップ : 1: 365ms, 2: 365ms, ...... 9: 364ms, 10: 359ms, 平均 360 ms
mtd:SIMDスワップ : 1: 316ms, 2: 319ms, ...... 9: 308ms, 10: 310ms, 平均 311 ms
mtd:ブロッキングSTDスワップ : 1: 370ms, 2: 368ms, ...... 9: 358ms, 10: 359ms, 平均 364 ms
mtd:ブロッキングSIMDスワップ : 1: 306ms, 2: 305ms, ...... 9: 304ms, 10: 305ms, 平均 306 ms
mtd:forスワップ : 1: 422ms, 2: 415ms, ...... 9: 414ms, 10: 413ms, 平均 414 ms
new:stdスワップ : 1: 0ms, 2: 0ms, ...... 9: 0ms, 10: 0ms, 平均 0 ms
new:forスワップ : 1: 385ms, 2: 384ms, ...... 9: 378ms, 10: 380ms, 平均 380 ms
vec:stdスワップ : 1: 0ms, 2: 0ms, ...... 9: 0ms, 10: 0ms, 平均 0 ms
vec:forスワップ : 1: 325ms, 2: 323ms, ...... 9: 316ms, 10: 314ms, 平均 318 ms
Arr N*N:N=1000
mtd:M2M2掛算 : 1: 873ms, 2: 864ms, ...... 9: 849ms, 10: 851ms, 平均 858 ms
new:M2M2掛算 : 1: 455ms, 2: 448ms, ...... 9: 441ms, 10: 440ms, 平均 443 ms
vec:M2M2掛算 : 1: 452ms, 2: 442ms, ...... 9: 442ms, 10: 443ms, 平均 443 ms
Arr N*N:N=20000
mtd:ランダムアクセス : 1: 9ms, 2: 9ms, ...... 9: 7ms, 10: 8ms, 平均 7 ms
new:ランダムアクセス : 1: 10ms, 2: 10ms, ...... 9: 7ms, 10: 7ms, 平均 8 ms
vec:ランダムアクセス : 1: 11ms, 2: 9ms, ...... 9: 10ms, 10: 9ms, 平均 9 ms
Arr N*N:N=10000
mtd:行アクセス : 1: 171ms, 2: 172ms, ...... 9: 169ms, 10: 170ms, 平均 169 ms
mtd:列アクセス : 1: 523ms, 2: 516ms, ...... 9: 513ms, 10: 511ms, 平均 514 ms
new:行アクセス : 1: 173ms, 2: 171ms, ...... 9: 169ms, 10: 171ms, 平均 171 ms
new:列アクセス : 1: 416ms, 2: 405ms, ...... 9: 401ms, 10: 397ms, 平均 401 ms
vec:行アクセス : 1: 177ms, 2: 186ms, ...... 9: 169ms, 10: 170ms, 平均 172 ms
vec:列アクセス : 1: 436ms, 2: 422ms, ...... 9: 409ms, 10: 414ms, 平均 415 ms
Arr N*N:N=20000
mtd:memset 0 : 1: 193ms, 2: 187ms, ...... 9: 175ms, 10: 176ms, 平均 178 ms
mtd:for 0 Set : 1: 221ms, 2: 225ms, ...... 9: 218ms, 10: 218ms, 平均 219 ms
new:for 0 Set : 1: 215ms, 2: 213ms, ...... 9: 209ms, 10: 208ms, 平均 209 ms
vec:std::fill 0 Set : 1: 193ms, 2: 178ms, ...... 9: 173ms, 10: 175ms, 平均 176 ms
vec:for 0 Set : 1: 209ms, 2: 207ms, ...... 9: 206ms, 10: 209ms, 平均 207 ms
mtd:Practice : 1:1891ms, 2:1802ms, ...... 9:1806ms, 10:1805ms, 平均 1813 ms
new:Practice : 1:2036ms, 2:2000ms, ...... 9:1983ms, 10:1986ms, 平均 1992 ms
vec:Practice : 1:1985ms, 2:1965ms, ...... 9:1965ms, 10:1965ms, 平均 1965 ms
=====================================================
=========== 全体集計 10回の平均時間 ===========
=====================================================
mtd:stdコピー 平均 197 ms
mtd:SIMDコピー 平均 266 ms
mtd:ブロッキング stdコピー 平均 275 ms
mtd:ブロッキングSIMDコピー 平均 267 ms
mtd:マルチスレ_STDコピー 平均 105 ms
mtd:forコピー 平均 332 ms
new:stdコピー 平均 271 ms
new:forコピー 平均 323 ms
vec:stdコピー 平均 270 ms
vec:forコピー 平均 325 ms
mtd:STDスワップ 平均 360 ms
mtd:SIMDスワップ 平均 311 ms
mtd:ブロッキングSTDスワップ 平均 364 ms
mtd:ブロッキングSIMDスワップ 平均 306 ms
mtd:forスワップ 平均 414 ms
new:stdスワップ 平均 0 ms
new:forスワップ 平均 380 ms
vec:stdスワップ 平均 0 ms
vec:forスワップ 平均 318 ms
mtd:M2M2掛算 平均 858 ms
new:M2M2掛算 平均 443 ms
vec:M2M2掛算 平均 443 ms
mtd:ランダムアクセス 平均 7 ms
new:ランダムアクセス 平均 8 ms
vec:ランダムアクセス 平均 9 ms
mtd:行アクセス 平均 169 ms
mtd:列アクセス 平均 514 ms
new:行アクセス 平均 171 ms
new:列アクセス 平均 401 ms
vec:行アクセス 平均 172 ms
vec:列アクセス 平均 415 ms
mtd:memset 0 平均 178 ms
mtd:for 0 Set 平均 219 ms
new:for 0 Set 平均 209 ms
vec:std::fill 0 Set 平均 176 ms
vec:for 0 Set 平均 207 ms
mtd:Practice 平均 1813 ms
new:Practice 平均 1992 ms
vec:Practice 平均 1965 ms
Hello World!