コンテクスト
私はこのようなコードを持っています:
..
vector<int> values = ..., vector<vector<int>> buckets;
//reserve space for values and each buckets sub-vector
for (int i = 0; i < values.size(); i++) {
buckets[values[i]].push_back(i);
}
...
したがって、同じ値を持つエントリのインデックスを持つ「バケット」を取得します。これらのバケットは、その後の処理で使用されます。
実際、私はネイティブの動的配列(int ** buckets;
)を使用していますが、簡単にするために、上記のベクトルを使用しました。
充填する前に、各バケツのサイズを知っています。
ベクトルのサイズは約2,000,000,000です。
問題
上記のコードを見るとわかるように、ランダムな方法で「バケット」配列にアクセスします。したがって、実行時間が大幅に遅くなる一定のキャッシュミスがあります。はい、プロファイルレポートにそのようなミスがあります。
質問
そのようなコードの速度を向上させる方法はありますか?
Auxベクトルを作成し、最初に出現する値をそこに配置しようとしました。したがって、2番目のインデックスを見つけたときに、対応するバケットに2つのインデックスを配置できます。このアプローチではスピードアップはありませんでした。
ありがとうございました!