语境
我有这样的代码:
..
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。
问题
如您所见,上面的代码以随机方式访问“buckets”数组。因此,它有不断的缓存未命中,从而大大减慢了执行时间。是的,我在个人资料报告中看到了这样的失误。
问题
有没有办法提高此类代码的速度?
我试图创建一个辅助向量并将第一次出现的值放在那里,因此我可以将两个索引放在相应的存储桶中,因为我找到了第二个。这种方法没有任何加速。
谢谢!