【发布时间】:2013-07-21 07:44:14
【问题描述】:
我有一个map<size_t, set<size_t>>,为了获得更好的性能,我实际上将其表示为按字典顺序排序的vector<pair<size_t, vector<size_t>>>。
我需要的是一个具有 快速 插入时间的set<T>(删除无关紧要),其中T 是上面的数据类型,以便我可以检查重复项(我的程序运行直到不再生成唯一的T。)。
到目前为止,从 set 切换到 unordered_set 已经证明是非常有益的(它使我的程序运行速度快了 25%),但即使是现在,插入 T 似乎仍然是主要的方法之一瓶颈。
给定T 中整数的最大数量约为 1000,每个整数也 T) .
我已经尝试过的:
-
使用
unsigned short。它实际上会稍微降低性能。 -
使用 Google 的
btree::btree_map。
它实际上要慢得多,因为我必须解决迭代器失效问题。
(我必须复制密钥,我认为这就是它变慢的原因。它至少慢了一倍。) -
使用不同的哈希函数。只要我使用合理的东西,我还没有发现任何可衡量的差异,所以这似乎无法改进。
我没有尝试过:
-
存储“指纹”/哈希而不是实际集合。
这听起来像是一个完美的解决方案,除了指纹识别功能需要快速,而且我需要非常确信不会发生碰撞,否则它们会搞砸启动我的程序。
(这是一个需要精确结果的确定性程序;碰撞使其无用。) -
以其他紧凑、CPU 友好的方式存储数据。
我不确定这会有多大好处,因为它可能涉及复制数据,到目前为止我获得的大部分性能是通过(巧妙地)避免在许多情况下复制数据。
如果有的话,我还能做些什么来提高速度?
【问题讨论】:
-
你使用 reserve() 吗?如果您有大量数据,则 hash_map 需要巨大的动态数组。那是瓶颈。
-
@thomas:是的,我愿意。 :) 我对几乎所有东西(包括哈希表)都使用
reserve,并避免使用移动/交换来复制容器。 -
请问
T到底是什么类型的? -
@larsmans: "... 其中
T是上面的数据类型",vector<pair<size_t, vector<size_t>>>. -
@Mehrdad:哪种类型?
map<size_t, set<size_t>>?pair<size_t, vector<size_t>>?
标签: c++ performance data-structures set hashtable