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

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

如果可能的话,我想要一些不基于基准测试的实际使用反馈。

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

有帮助吗?

解决方案

STLPort 。没有测量内存使用差异,但它肯定更快(是的,实际使用)。

其他提示

我质疑你的基本前提,即你无法切换到更新版本的MSVC。

我不认为你会获得更低的记忆和更高的性能“免费”通过下载新的STL。或者至少,如果你这样做了,你可能需要做很多代码修复,就像你刚刚更新到最新的MSVC一样。

长期来看,毫无疑问你想要更新......现在就做,你可能获得幸运,并免费获得一些内存和性能。

我能想到的唯一一件事就是按照你所说的你想要的东西来尝试英特尔编译器,我有好的(性能!)和坏(古怪,有时候) !)体验。

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

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

您是否已对自己的代码进行了分析,并对那些存在问题的区域进行了小幅调整?我认为这比你正在考虑的要痛苦得多。

大部分取决于您所谈论的容器以及您如何使用它。 向量通常具有最小的占用空间,除非您添加超出当前向量容量的元素。在那一刻,它将分配类似1.5 x当前向量容量的东西,移动元素(或者在最坏的情况下创建一个也分配内存的新副本),当这样做时,删除旧的向量内部,如果你知道如何它将保留前面的许多元素,使用预留矢量是最好的选择。

第二小是列表。它的优点是它不会自己制作临时副本。在那之后,你最好的选择可能就是设定。现在有些实施已经下滑,这个实施较小。在这些情况下,很容易制作一个在页面中打包内存的分配器。 远离像unordered_ *

这样的记忆猪

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

到目前为止,大多数内存有效的容器都是boost / intrusive。因为它们使用被包含的东西的内存,所以它们的占用空间非常小。因此,对于链表或rb树节点,为了一小块内存进入堆的instread,节点指针是对象本身的一部分。然后是“容器”。只是一个用于创建根节点的指针的原始集合。我已经用了很多次来摆脱足迹和分配开销。

大多数STL实现(包括MSVC2003之一)都是经过良好实现的通用库。因此,您不会看到从一个实现到另一个实现的显着性能提升。

但是,有时您可以编写比STL更快的算法(或容器),因为您了解STL编写器没有新的数据(因为他们正在编写通用容器和算法)。

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

如果性能对您的应用程序如此重要,并且STL与其交织在一起,是否有可能找到一个开源实现(例如 STL-Port ,如上所述)并自行分配,根据需要改进性能?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top