C++ 使用大堆栈和稀疏散列时性能低下

C++ 使用大堆栈和稀疏散列时性能低下,c++,hashset,C++,Hashset,我有一大堆未签名的long-long(100M+),我正试图将它们放入SparseHash中,但性能非常慢,因为对于每1k个条目,在内存为16Gb的MacBook Pro上大约需要4-6秒 while (stackUI.size()>0) { Set.insert(stackUI.top()); stackUI.pop(); if (stackUI.size()%1000==0) { cout<<stack

我有一大堆未签名的long-long(100M+),我正试图将它们放入SparseHash中,但性能非常慢,因为对于每1k个条目,在内存为16Gb的MacBook Pro上大约需要4-6秒

    while (stackUI.size()>0) {
       Set.insert(stackUI.top());
       stackUI.pop();
       if (stackUI.size()%1000==0) {
           cout<<stackUI.size()<<" "<<time(0)<<endl;
    }
}
while(stackUI.size()>0){
Set.insert(stackUI.top());
stackUI.pop();
if(stackUI.size()%1000==0){

您是否将性能与gcc哈希集进行了比较


散列容器的大小是原来的两倍,当加载因子变高时(比如0.5),它会复制所有内容。因为你已经知道你的散列集将容纳多少个元素(我猜是你的堆栈大小)在你开始插入之前尝试保留那些桶,这样你就可以避免重新散列并得到显著的加速。

自从我在C++中编程以来,很长时间了,但是我要检查的一些事情:A)看看你是否可以预先定义集合的项数,所以它不会扩展每个引入的几个项,而B)减少。调用
stackUI.size()
(我对此表示怀疑,但只需在迭代之前存储值并不断递减它就很容易了)。稀疏哈希的基准插入?显示插入速度非常慢(不确定是否应该像现在这样慢)@Dgrin91他每1000个条目做一次……应该不会花那么长时间。您使用的是stl容器吗?如果是,是哪一个?我很难确定如何预定义哈希集的大小。使用稀疏哈希,我只是定义了集,然后在下一行调用set.resize(setSize)set.resize(stackUI.size())在开始插入集合之前,只需插入一次就可以了。