覚書 なぜ 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!