我有一个map<size_t, set<size_t>>
,为了获得更好的性能,我实际上将其表示为按字典顺序排序的vector<pair<size_t, vector<size_t>>>
。
我需要的是set<T>
具有快速插入时间(删除无关紧要),T
上面的数据类型在哪里,以便我可以检查重复项(我的程序运行直到不再T
生成 unique 。)。
到目前为止,从set
to切换unordered_set
已经证明是非常有益的(它使我的程序运行速度快了 25% 以上),但即使是现在,插入T
似乎仍然是主要瓶颈之一。
给定的最大整数数T
约为 1000,每个整数也 <= ~1000,因此数字非常小(但T
生成了数千个)。
我已经尝试过的:
使用
unsigned short
. 它实际上会稍微降低性能。使用谷歌的
btree::btree_map
.
它实际上要慢得多,因为我必须解决迭代器失效问题。
(我必须复制密钥,我认为这就是它变慢的原因。它至少慢了一倍。)使用不同的哈希函数。只要我使用合理的东西,我还没有发现任何可衡量的差异,所以这似乎无法改进。
我没有尝试过的:
存储“指纹”/哈希而不是实际集合。
这听起来像是一个完美的解决方案,除了指纹功能需要快速,而且我需要非常确信不会发生碰撞,否则它们会搞砸我的程序。
(这是一个需要精确结果的确定性程序;碰撞使其无用。)以其他紧凑、CPU 友好的方式存储数据。
我不确定这会有多大好处,因为它可能涉及复制数据,而且到目前为止我获得的大部分性能都是通过(巧妙地)避免在许多情况下复制数据。