2011-10-24 22 views
15

道歉another internet forum quote,但我认为这是有趣的,要问:Boost/STL在高性能计算方面是否缓慢?

C++是更快,如果你扔编程的“安全”的特点 语言,并避免类似的事情STL和升压。在原始字节字节 C++比较快,但再这样为C.

您添加STL的行李,和Boost你比 写得很好的C#代码慢的那一刻。 C#JIT和Java jit拥有的优点是这些安全功能已经过优化。 C++安全特性 依赖于编译器的优化。

因此,如果你不小心你的STL,并且升压代码,你会有一个应用程序的跛脚鸭子 。

我同意摆脱安全功能,但我看到很多高频招聘广告,他们都要求提升经验。当然,Boost对于生成快速代码不会有什么不好的地方?或者,这个人只是在理论上说明,如果你只是在字节级操纵它会更快?

编辑:引述是关于STL和Boost,因此我添加了STL标签。

+41

凡说,不知道他在说什么。 –

+5

不同意STL或BOOST会让你变慢。请参阅:http://stackoverflow.com/questions/3664272/stdvector-is-so-much-slower-than-plain-arrays/3664349#3664349 –

+1

不要忘记,在招聘广告中,他们可能会更多地寻找人谁先写*正确*代码,性能是次要的(尽管仍然很重要)。 –

回答

22

升压和C++标准库用于产生极其快速的生产实现。当然,在特定情况下可以改进 - 这与编写自己的分配器类似,当你知道你的执行与通用分配器有什么不同时,以及如何针对该用途进行优化。所以当然可以分析问题并产生比通用实现(或增强)更快的优化实现。

当然,任何库也可能被滥用,这可能会导致执行受损。缺点是boost(一大批库)实现是快速实现的极好起点。如果您需要它比提升更快,请确定问题并加以改进。

许多C++开发人员都在关注性能;一般来说,超过其他语言。提升一般都受到好评,经过同行评审,实现用于测试和形成标准库特性的基础。

-----

感谢贾斯汀让我分享封闭的问题他的答案: - 赛斯

恰恰相反。

提升是不是关于安全带。

升压为约高电平软件组件,具有高电平抽象这避免了通常的“库锁定”看到与其他框架/库。

例如,您的Boost图库不会而不是要求您根本切换数据结构:您可以使用/调整任何适合您应用程序的性能良好的数据结构。在最糟糕的情况下,你可能需要编写一个特质类来帮助Boost解释;恰恰是这种特性(现代模板库的共同特点)使得Boost在实践中表现得像:不会有那么多库阻抗不匹配。这直接符合C++ 11关于线程和移动语义的新概念:即使是最基本的数据复制情况也是如此。另外,所有这些库都会遵循您自己的分配器实现,从而实现无法超越的内存管理性能。您可以对齐在C#中的128位INT载体 - 但你必须经过很多很多箍且存在没有办法你都不能使它与框架API的工作跳跃。

在C++中,您仅支付所使用的费用,而Boost完全是这种精神。

嗯,我想我还没有完全强调一点还不够,但我现在做。

让我从另一面来看它:在C#中编写高性能代码要困难得多,因为很难看到幕后发生了什么。

一旦你放弃的场景(不安全模式IL代码),你可以说是比用C不太安全++后面,因为在C++中发生了什么地方和如何透明的政策。在C#中,你甚至不能相信你在一行之前得到的int*(因为垃圾收集器可能已经移动了你的奶酪)。不知道编译器 和/或JIT引擎会使用您的好通用代码。

简而言之:您可以在任何地方编写糟糕的代码,但Boost不能被指责。 STL只能归咎于疯狂的原始表现。

POCO,QT,MFC,WTL,诸如此类的东西....

Mono SIMD

包括接近可怜,大张旗鼓地违反了 '惊喜原则至少是' 众多领域(example coming when blog back online

std::copy会静态翻译成基于SSE4,MOVSW或金钱可以购买的简单memcpy的最佳实现,但您甚至不必写一个字母,而是将istream复制到可以这么说。

+0

我可以借用我已经写好的答案吗?我讨厌把它放在垃圾箱里:) – sehe

+0

@sehe我不明白为什么不。继续,但请在答案中添加注释以避免混淆=) – justin