【发布时间】:2012-05-13 08:46:41
【问题描述】:
上下文
我有这样的代码:
..
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”数组。因此,它有不断的缓存未命中,从而大大减慢了执行时间。 是的,我在个人资料报告中看到了这样的失误。
问题
有没有办法提高此类代码的速度?
我尝试创建一个辅助向量并将第一次出现的值放在那里,因此我可以在找到第二个时将两个索引放入相应的存储桶中。这种方法并没有带来任何加速。
谢谢!
【问题讨论】:
-
使用比
int更小的类型。 -
@Pubby 如何以较小的类型存储范围为 0..2,000,000,000 的索引?
-
你能轻松计算 foo() 的倒数吗? (如果确实是轻量级的,贴一下吧,说不定能给人思路……)
-
你到底想做什么?对 20 亿个条目进行桶排序,每个可能的最终值一个桶?尝试基数排序以至少减少存储桶的数量...合并排序可能会导致最少的页面错误(并且它是就地的,因此您不需要 14GiB ram)。
-
如果你想对数组进行排序并且缓存未命中是限制因素,那么显然桶排序不是正确的做法。它似乎是整个例程的主要部分,所以我建议使用并行(就地)合并排序。
标签: c++ arrays performance