【发布时间】:2011-03-23 20:30:46
【问题描述】:
我在 Visual Studio 2010 中使用 C++。我有一个 STL 集,当我的程序关闭时我将其保存到文件中。下次程序启动时,我将(排序的)数据加载回一个集合中。我正在尝试优化加载过程,但遇到了麻烦。我怀疑问题出在频繁的重新平衡上,我正在寻找一种方法来避免这种情况。
首先,我没有优化,使用“set->insert (const value_type& x)”
时间:~5.5分钟
然后我尝试使用 insert() 的版本,您在其中传递了 insert() 位置的提示:
iterator insert ( iterator position, const value_type& x );
大致上,我是这样做的:
set<int> My_Set;
set<int>::iterator It;
It = My_Set.insert (0);
for (int I=1; I<1000; I++) {
It = My_Set.insert (It, I); //Remember the previous insertion's iterator
}
时间: ~5.4 分钟
几乎没有任何改进!我认为问题不在于从文件读取的开销——注释掉 insert() 将时间减少到 2 秒。我认为问题不在于复制我的对象的开销——它是一个带有 int 和 char 的普通旧数据对象。
我唯一能想到的就是这个系列在不断地重新平衡。
1.) 你同意我的猜测吗?
2.) 有没有办法在我加载集合时“暂停”重新平衡,然后在最后重新平衡一次? (或者……这会有帮助吗?)
3.) 有没有更聪明的方法来加载排序的数据,而不是简单地从最低移动到最高?也许交替我的插入,这样它就不必经常平衡? (例如:插入 1、1000、2、999、3、998、...)
【问题讨论】:
-
这是一个 DEBUG 版本吗?时间看起来像一个。
-
这是一个调试版本。但我们正在处理大量数据,所以约 5.5 分钟并不让我感到惊讶。
-
@fazo:我做到了。那是我提到的约 5.5 分钟时间。
-
为调试构建计时是没有意义的。
-
@user673772:如果从文件中读取需要 2 秒,那么插入一个集合需要 5 分钟,这听起来令人惊讶。在进行任何类型的性能测量之前启用优化。