什么是具有最小内存占用的STL实现?

时间:2020-03-06 14:36:22  来源:igfitidea点击:

我正在开发一个大规模使用STL的大型计算库。该库是使用MSVC2003构建的,并且正在使用其STL实现。
我正在寻找一种替代的STL实现,可以帮助该库降低其内存需求并提高其性能。

目前无法切换到较新版本的MSVC。

如果可能的话,我希望获得一些关于实际使用情况的反馈,而不是基于基准。

编辑:为了更清楚一点,例如某些STL实现(例如STLSoft)提出了针对字符串连接的特定优化;这些听起来影响很小,但可以带来很大的改进。 STLPort是另一个很好的例子,他们清楚地说明了他们的目标:拥有最快的STL实现,stdlib ++等……所有这些都是不错的选择,但我没有时间测试它们,我需要一些社区帮助在那上面。

解决方案

STLPort。尚未测量内存使用差异,但是绝对更快(是的,实际使用情况)。

我质疑基本前提,即我们不能切换到较新版本的MSVC。

我认为我们不会通过下载新的STL来"免费"获得更低的内存和更高的性能。或者至少,如果这样做了,我们可能必须做许多代码修补程序,就像仅更新到最新的MSVC一样。

长期而言,毫无疑问,我们想更新...现在就做,我们可能会很幸运,并免费获得一些记忆和性能。

我可以想到的唯一建议就是尝试使用英特尔编译器,该编译器我既有良好的性能(性能!),也有不良的(有时很古怪!)经验和。

除此之外,找到我们自己的内存和性能问题,并编写自定义容器和算法。 STL很棒,但是它并不是解决所有情况下所有问题的灵丹妙药。领域知识是我们最好的盟友。

大多数STL实现(包括MSVC2003之一)都是实现良好的通用库。因此,我们不会看到从一种实现到另一种实现的重大性能改进。

但是,有时我们可以为自己编写比STL更快的算法(或者容器),因为我们知道一些有关STL编写者并不陌生的数据(因为他们正在编写通用容器和算法)。

总之,如果我们想提高应用程序性能,则最好尝试创建专门适合我们数据的专用容器,而不是寻找性能更高的STL。

如果性能对应用程序至关重要,并且将STL交织到其中,是否有可能找到一个开源实现(例如STL-Port,如上所述)并为自己分叉,从而根据需要改进性能?

一方面,我可以看到这成为一个滑坡,我们在其中对STL库的fork进行了非标准的修改,从而产生了问题。但是,性能对应用程序的重要性可能超过发生这种情况的风险。

我们是否考虑过编写自己的内存分配器?如果我们不喜欢内存分配策略,则不必总是切换整个STL。所有容器都接受替换分配器。

我们是否配置了代码并考虑了对问题所在区域的细微调整?我认为这将比我们考虑的要少得多。

大多数情况取决于我们在谈论哪个容器以及如何使用它。
向量通常具有最小的占用空间,除非我们添加的元素超出了当前向量的容量。届时,它将分配大约1.5倍当前向量的容量,移动元素(或者在最坏的情况下,创建一个新副本,该副本也分配内存),完成后,删除旧的向量内部,如果我们知道如何它要坚持很多要素,使用储备金的向量是最好的选择。

第二小的是列表。它的优点是不会对其进行临时复制。在那盘之后,我们最好的选择可能就是在那盘。一些实现现在具有slist,它较小。在这些情况下,tt可以很容易地创建一个将内存打包在页面中的分配器。
远离诸如unordered_ *之类的记忆猪

在MSVC上,请确保#define _SECURE_SCL = 0,这会花费大量用于安全编程检查的开销(例如缓冲区溢出等)

到目前为止,内存效率最高的容器是boost / intrusive容器,因为它们使用所容纳事物的内存,因此占用空间极小。因此,对于将链表或者rb树节点移到堆中一小段内存的理解,节点指针是对象本身的一部分。然后,"容器"只是一个原始集,其中包含几个用于创建根节点的指针。我已经使用了很多次,以消除占用空间和分配开销。