从Microsoft的STL切换到STLport

15

我在Windows下的性能关键C++代码中使用了相当多的STL库。一种可能的“便宜”提高性能的方法是更换一个更快的STL库。

根据这篇博客文章,STLport更快、占用更少的内存,不过这篇文章有些年头了。

最近有没有人做过这个更改,你们的结果如何?

8个回答

15

我没有比较STLPort和MSCVC的表现,但如果有任何明显的差异,我会感到惊讶。(当然是在发布模式下 - 调试版本很可能会有很大不同。)不幸的是,你提供的链接 - 以及我看过的任何其他比较 - 都缺乏细节,无法提供有用的信息。

在考虑更改标准库提供程序之前,我建议你对代码进行深度分析,以确定瓶颈在哪里。这是标准建议; 在尝试任何性能改进之前始终进行分析!

即使分析表明标准库容器或算法存在性能问题,我建议你首先分析如何使用它们。算法改进和适当的容器选择,特别是考虑大O成本,更有可能带来更高的性能回报。


来到这里,遇到了同样的问题。实际上,考虑到在VS2010中没有TR1引入的哈希集映射和所有其他东西,差异可能是O(1)与O(N)之间的差异... - ntg

9
在进行转换之前,请确保使用关闭检查的迭代器测试MS(事实上是Dinkumware)库。由于某种奇怪的原因,它们在发布版本中默认开启,这会对性能产生很大影响。请注意保留HTML标记。

非常好的观点,这会产生重大影响。 我自己已经禁用了它们,但这可能是我在帖子中提到的博客发布加速的原因。 - Laserallan

6
我们最近完成了相反的任务。我们的应用程序是一个跨平台的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_unlock。据我所知,pthread_mutex_lock / pthread_mutex_unlock被用于默认的gcc STL库中使用的COW字符串。在我们的应用程序中,我们执行了大量的字符串赋值,由于COW字符串的结果,我们的性能变差。因此,我们仍然在HP-UX上使用带有gcc的STLPort。

5

我一年前做了完全相反的事情,原因如下:

  • 据我所知,StlPort很少更新(只有一个开发人员在工作,您可以查看他们的提交历史记录
  • 每当您切换到新的Visual Studio版本时,都会出现构建问题。您等待新的make文件或自己创建它,但有时由于某些配置选项而无法构建它。然后您等待他们使其构建。
  • 当您提交错误报告时,您将永远等待,因此基本上没有支持(也许如果您付款)。如果您知道如何修复它,则通常会自行修复。
  • Visual Studio中的STL具有已检查的迭代器调试迭代器支持,比StlPort中的要好得多。这就是大部分减速来自的地方,特别是在调试模式下。已检查的迭代器在调试和发布模式下均启用,这不是每个人都知道的(您必须自行禁用它们)。
  • Visual Studio 2008 SP1中的STL带有TR1,而您在StlPort中没有这个功能
  • Visual Studio 2010中使用C++0x的rvalue引用,这是您获得真正性能优势的地方。

5
在我参与的一个项目中,我们大量使用了STL。但是当我们切换到STLport后,完成工作所需的时间减少了一半。虽然这并不是证明,但我认为这是性能良好的一个很好的迹象。我认为这部分是由于STLport的先进内存管理系统所致。
我记得在进行这个更改时会有一些警告,但没有什么是无法快速解决的。作为缺点,我想说的是,在使用Visual Studio的调试器时,STLport的调试比Microsoft的STL要困难一些(更新:看起来有一种方法可以向调试器解释如何处理STLport容器,感谢Jalf!)。
最新版本可以追溯到2008年10月,因此仍有人在使用它。请点击这里进行下载。

4
关于调试,不就是为调试器设置正确的可视化工具吗?http://stlport.svn.sourceforge.net/viewvc/stlport/trunk/STLport/etc/autoexp.dat?revision=HEAD - jalf
1
请问您能具体说明一下“一半的时间”的报价吗?我猜测您使用的是发布版本,我的猜测正确吗?您当时在做什么? - MattyT
1
这篇文章几年前就写成了,而不是STLport。 - Laserallan
我正在开发一个图算法(使用Boost.Graph,它本身使用stl)。我正在遍历顶点和边,构建符合条件的元素列表,然后遍历这些列表...执行时间从17秒降至8秒。当然,这是一个发布版本。 - Benoît
抱歉,Laserallan,我误解了你问题的那一部分。 - Benoît

3

如果您使用STLPort,那么您将进入一个世界,在这个世界中,您使用的每个基于STL的第三方库都必须重新编译为STLPort,以避免出现问题……

STLPort确实有不同的内存策略,但如果这是您的瓶颈,那么您的性能提升路径是更改分配器(例如切换到Hoard),而不是更改STL。


stlport可以配置与stl一起使用。这意味着您必须更加谨慎地使用它,而不仅仅是替换掉原有的部分。 - 0xC0DEFACE

0

我没有尝试过,但据我所知,微软的STL实现没有进行重大更改。(VS2008编译器与2005相比也没有太多新的优化)因此,如果STLPort以前更快,那么现在可能仍然如此。

但这只是猜测。 :) 如果您尝试了,请务必报告结果。


-3
一个使用stlport的好处是它是开源的。

真实,但与问题无关 - 0xC0DEFACE
17
我想知道您如何创建一个闭源的STL实现。 - jalf
2
就像不在头文件中添加开源许可证一样容易。请记住,开源是指许可证,而不是您是否可以阅读源代码... - Benj
4
不正确,Benj。开源的意思就是它听起来的样子:源代码是可以访问的。你可能指的是“自由软件”或者“自由如言论”。 - libeako

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接