Boost/STL在高性能计算方面是否很慢?
Is Boost/STL slow with regard to high performance computing?
为另一个互联网论坛引用道歉,但我认为这很有趣,想问:
如果放弃编程的"安全"特性,c++会更快语言,避免像STL和Boost这样的东西。以原始字节到字节表示c++更快,但C也一样。当你添加STL和Boost的包袱时,你会比编写良好的c#代码。c# JIT和Java JIT所具有的优势这些安全功能得到了很好的优化。c++安全特性依赖于编译器的优化。
因此,如果您不小心使用STL和Boost代码,您将会有一个跛脚鸭的应用程序。
我同意删除安全功能,但我见过很多高频招聘广告,他们都要求Boost经验。Boost对生成快速代码来说肯定不是坏事吧?或者这个人只是在理论上说,如果你只是在字节级别操作,它会更快?
编辑:引用是关于STL和Boost的,因此我添加了STL标签。
不
boost和c++标准库用于生成极快的生产实现。当然,可以在特定的场景中改进这些实现——这类似于当您知道自己的执行与通用分配器有何不同,以及如何针对这种用法进行优化时编写自己的分配器。因此,当然可以分析问题并生成比通用实现(或boost)更快的优化实现。
当然,任何库都可能被误用,这可能导致执行受到损害。它的缺点是boost(一个大型库集合)实现是快速实现的一个很好的起点。如果您需要它比boost更快,请确定问题并改进它。许多c++开发人员关心性能;总的来说,比其他语言要多。Boost通常得到很好的评价,同行评审,其实现用于测试并形成标准库特性的基础。
<标题>,感谢 Justin让我分享他对封闭问题的回答: —Seth
标题>恰恰相反。
Boost是而不是关于安全带。
Boost是关于高级软件组件的,具有高级抽象,这避免了在其他框架/库1中常见的"库锁定"。
例如,Boost Graph库根本不需要切换数据结构:您可以使用/调整任何适合您的应用程序的数据结构。在最坏的情况下,你可能不得不写一个trait类来帮助Boost进行解释;正是这个特性(现代模板库中常见的)使Boost在实践中表现得像其他任何:不会有那么多库阻抗不匹配。这与c++ 11关于线程和移动语义的新概念直接一致:防止即使是最基本的数据复制情况。而且,所有这些库都支持您自己的分配器实现,从而实现无与伦比的内存管理性能。你可以在c#中对齐128位int向量-但是你必须跳过很多很多的障碍2,并且没有办法让它与框架API一起工作。
在c++中,你只需要为你所使用的东西付费,Boost完全遵循了这种精神。
嗯,我想我还没有充分强调这一点,但是我现在已经说完了。
让我从另一个角度来看它:在c#中编写高性能代码要困难得多,因为很难看到幕后发生的事情。
一旦你在幕后(不安全模式, IL代码),你可能会比c++更不安全,因为在c++中有一个透明的策略,告诉你在哪里发生了什么以及如何发生。在c#中,你甚至不能信任前一行得到的
int*
(因为垃圾收集器可能已经移动了你的奶酪);没有人知道编译器或者JIT引擎会把你漂亮的泛型代码变成3。简而言之:您可以在任何地方编写糟糕的代码,但不能责怪Boost。STL只能归咎于疯狂的原始性能4。
<子>子>
<一口> 1> p> <一口> 2> p>3包括许多接近可悲的地方,并且在很大程度上违反了"最不意外原则"(例如当博客重新上线时
来)一口>一口>4
std::copy
将在基于SSE4, MOVSW或金钱可以买到的普通内存的最佳实现中被静态翻译,然而你甚至不必写一个不同于将istream
复制到set
的字母,可以这么说。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 区域设置是否有定义负号的方面?
- 查找我的算法的运行时间,以查找输入在输入方面是否是素数
- 编译器在常量表达式中认为未定义的行为方面是否允许回旋余地?
- 虚拟方法返回代表派生对象类型的枚举 - 是否可以(在设计方面)
- 在性能方面获取线程 ID 是否昂贵
- 在内存使用方面,templates+functors/lambdas是否次优
- 如果机器立即崩溃,那么fflush()在将数据保存到磁盘方面是否与fclose()一样好?
- Boost/STL在高性能计算方面是否很慢?
- 测试值是否在阈值范围内的最佳方法(性能方面)是什么