キャッシュヒット:キャッシュの最適化は、CPUのパフォーマンスのために運用パフォーマンスの固体記録を打ちます

シナリオ説明

コードの最初に:

  • code1:
void Graph::shufle(int cnt) {
    for (int i = 1; i<cnt; i++) {
        unsigned int swid = fastrand() % (cnt-i)  ;
        std::swap(iCons[cnt - i], iCons[swid]);
        std::swap(jCons[cnt - i], jCons[swid]);
        std::swap(dCons[cnt - i], dCons[swid]);
        std::swap(wCons[cnt - i], wCons[swid]);
    }
}
  • code2
// 作用为快速取得随机数
unsigned int g_seed = 0;
unsigned int fastrand() {
    g_seed = (214013 * g_seed + 2531011);
    return g_seed;
}
  • code3
// 与代码2的区别在于取值范围变为了65535
unsigned int fastrand() {
    g_seed = (214013 * g_seed + 2531011);
    return (g_seed >>16) & &7FFF;
}

実際の結果:

  • cnt : 107403264
  • code2 timeuse : 3489 ms
  • code3 timeuse : 984 ms

分析

両方のタグ得られた結果との間のほぼ3.5倍の差は、最初にモジュロ起因すると疑われます。疑い-O3コンパイラの最適化では、小さい方の値が直接バック値自体にしばしばモジュロ。code1スワップもことが判明した後、培地を除去するcode2方法は、光のみ発生乱数が望ましいです69msしたがって、モジュロなどのパフォーマンスのボトルネックを解消。

私たちは、ことに注意することができcode3生産数は多くの場合よりも少ない65535、とi減少が続いています。このように、のためのcode3目的で、常に最初のメモリ・アクセス・65535アドレス、および移動させるためにcnt-icode2発生した乱数cnt-iモジュロ、非常に大きな範囲の数、したがって常に原因cache missなので、よりcode2遅く3.5倍。

おすすめ

転載: www.cnblogs.com/fahaizhong/p/12240075.html