我在Windows下的性能关键C++代码中使用了很多STL.获得一些额外性能的一种可能的"廉价"方式是改为更快的STL库.
根据这篇文章, STLport更快,使用更少的内存,但它已经有几年了.
最近有人做过这个改变,你的结果是什么?
我没有将STLPort的性能与MSCVC进行比较,但如果存在显着差异,我会感到惊讶.(当然,在发布模式下 - 调试版本可能会有很大差异.)不幸的是,您提供的链接 - 以及我所看到的任何其他比较 - 对于细节来说太过有用了.
在考虑更改标准库提供程序之前,我建议您大量分析代码以确定瓶颈所在.这是标准建议; 在尝试任何性能改进之前始终保持简
即使分析确实揭示了标准库容器或算法中的性能问题,我建议您首先分析您如何使用它们.算法改进和适当的容器选择,特别是考虑Big-O成本,更有可能带来更高的性能回报.
在进行切换之前,请务必测试MS(实际上是Dinkumware)库,并关闭已检查的迭代器.出于一些奇怪的原因,即使在发布版本中它们也默认打开,这在性能方面有很大的不同.
我们最近做了相反的任务.我们的应用程序是一个跨平台的C++服务器程序,它构建在Windows上的VS 2008(x86)和HP-UX ia64和Linux上的gcc 4.3.在每个平台上,我们使用STLport 5.1.7作为STL库和Boost 1.38.
为了比较前一段时间的性能,我们还在没有STLport的情况下构建了应用程序,之后我们测量了性能.
在Windows之后,性能变得稍微好一些.所以我们选择停止在VS 2008中使用STLport并使用默认的VS 2008 STL库.
在HP-UX ia64上,性能下降了20%.Caliper(HP-UX分析器)显示字符串分配花费更多时间.在默认gcc STL库中的字符串赋值内部,调用了pthread_mutex_unock.据我所知,使用pthread_mutex_lock/pthread_mutex_unlock,因为默认的gcc的STL库使用COW字符串.在我们的应用程序中,我们执行大量字符串分配,并且由于COW字符串,我们的性能会变差.所以我们仍然在使用gcc的HP-UX上使用STLPort.
在我工作的一个项目中,使用stl非常繁重,切换到STLport导致在微软STL实现的一半时间内完成工作.这不是证明,但我认为这是表现的良好迹象.我相信这部分归功于STLport先进的内存管理系统.
我确实记得在做这个改变时得到一些警告,但没有什么是无法快速解决的.作为一个缺点,我要补充一点,使用Visual Studio的调试器调试STLport比使用Microsoft的STL更简单(更新:似乎有一种方法可以向调试器解释如何处理STLport容器,感谢Jalf!).
最新版本可以追溯到2008年10月,因此仍然有人在努力.请看这里下载它.
一年前我完全相反,这就是为什么:
StlPort很少更新(据我所知只有一个开发人员正在处理它,你可以看看他们的提交历史)
每当您切换到新的Visual Studio版本时,都会出现问题.您等待新的make文件或自己创建它但有时由于您正在使用的某些配置选项而无法构建它.然后你等着他们建立它.
当你提交错误报告时,你会永远等待,所以基本上没有支持(也许你付钱).如果你知道如何,你通常会自己修理它.
Visual Studio中的STL已检查迭代器并调试迭代器支持,这比StlPort中的更好.这是大多数减速来自特别是在调试中的地方.在调试和发布中都启用了经过检查的迭代器,这不是每个人都知道的(你必须自己禁用它们).
Visual Studio 2008 SP1中的STL附带TR1,您在StlPort中没有此功能
Visual Studio 2010中的STL使用来自C++ 0x的右值引用,这是您获得真正性能优势的地方.