シナリオ説明
コードの最初に:
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-i
。code2
発生した乱数cnt-i
モジュロ、非常に大きな範囲の数、したがって常に原因cache miss
なので、よりcode2
遅く3.5倍。