boost vs ACE C ++跨平台性能比较?

时间:2009-01-23 22:18:19

标签: c++ performance boost cross-platform ace-tao

我参与了一项将从Win32迁移到Linux的一些通信,解析,数据处理功能的企业,并且都支持这两种功能。问题域对吞吐量和性能非常敏感。

我对boost和ACE的性能特征经验很少。具体来说,我们想要了解哪个库为线程提供了最佳性能。

任何人都可以提供一些数据 - 记录在案或口口相传或者某些链接 - 关于两者之间的相对表现吗?

修改

谢谢大家。确认了我们最初的想法 - 我们最有可能选择提升系统级跨平台的东西。

11 个答案:

答案 0 :(得分:27)

与使用本机OS线程设施相比,这两个库都不应该有任何开销。你应该看看哪个API更干净。在我看来,boost thread API更容易使用。

ACE往往更像是“经典的OO”,而提升则倾向于从C ++标准库的设计中汲取灵感。例如,在ACE中启动一个线程需要创建一个从ACE_Task派生的新类,并覆盖在线程运行时调用的虚拟svc()函数。在boost中,您可以创建一个线程并运行您想要的任何功能,这种功能明显较少。

答案 1 :(得分:20)

帮自己一个忙,避开ACE。如果你问我,这是一个可怕的,可怕的图书馆。我已经工作了(或者更确切地说是HAD与它一起工作了3年)而且我告诉你它是一个设计糟糕,记录不良,使用过时的C ++并且完全依赖于脑死亡的设计决策而实施得很糟糕的垃圾... “C with classes”实际上是在帮助它。如果你研究一些构造的内部实现,你通常很难抑制你的呕吐反射。 另外,我不能强调“糟糕的文档”方面。通常,ACE的记录功能的概念包括简单地打印功能的签名。至于它的论证的意义,它的回报价值及其一般行为,你通常只能自己解决这个问题。我厌倦了不得不猜测函数可能会抛出哪些异常,哪个返回值表示成功,我必须传递哪些参数才能使函数执行我需要它做的事情或者函数/类是否是线程安全的或不。

另一方面,提升,使用简单,现代的C ++,非常好的文档,它只是工作!使用ACE可以提升Boost!

答案 2 :(得分:8)

不要担心线程和同步对象上的OS抽象层的开销。字面上的线程开销根本不重要(因为它只适用于线程创建,与异步指针间接开销相比,这已经非常慢)。如果您发现互斥操作正在减慢您的速度,那么您最好不要查看原子操作或重新安排数据访问模式以避免争用。

关于提升与ACE,这是“新风格”与“旧式”编程的问题。 Boost有很多仅基于模板的模板恶作剧(如果你能欣赏它,它们很漂亮)。另一方面,如果你已经习惯了“C with classes”风格的C ++,ACE会感觉更自然。我认为这主要取决于你团队的个人品味。

答案 3 :(得分:7)

我已将ACE用于众多重型生产服务器。它永远不会让我失望。它坚如磐石,现在已经做了很多年。试图学习BOOST的ASIO网络框架 - 无法掌握它。虽然BOOST是更“现代”的C ++,但它也更难用于非平凡任务 - 没有“现代”C ++经验和深层STL知识,很难正确使用

答案 4 :(得分:6)

即使ACE是一种老式的C ++,它仍然具有许多面向线程的功能,而这些功能尚未提供。

目前我认为没有理由不同时使用两者(但出于不同的目的)。一旦boost提供了在任务之间实现消息队列的简单方法,我可以考虑放弃ACE。

答案 5 :(得分:3)

在易用性方面,提升比ACE更好。 boost-asio具有更透明的API,其抽象更简单,可以轻松地为您的应用程序提供构建块。编译时多态性在boost中明智地用于警告/防止非法代码。另一方面,ACE对模板的使用仅限于泛化,并且几乎不以用户为中心,不允许非法操作。使用ACE,您更有可能在运行时发现问题。

我能想到的一个简单例子是ACE_Reactor - 一个相当可扩展和解耦的接口 - 但如果你在一个与创建它不同的线程中运行它的事件循环,你必须记住调用它的“自己的”函数。我花了几个小时来第一次弄明白这一点,并且可以轻松度过几天。具有讽刺意味的是,它的对象模型显示出比隐藏更多的细节 - 有利于学习,但对抽象有害。

https://groups.google.com/forum/?fromgroups=#!topic/comp.soft-sys.ace/QvXE7391XKA

答案 6 :(得分:2)

线程实际上只是boost和ACE提供的一小部分,而且这两者在整体上并不具有真正的可比性。我同意boost更容易使用,因为ACE是一个相当繁重的框架。

答案 7 :(得分:2)

我不会将ACE称为“C with classes”。 ACE并不直观,但如果你花时间按照预期使用框架,你就不会后悔。

据我所知,在阅读Boost的文档后,我想使用ACE的框架和Boost的容器类。

答案 8 :(得分:1)

使用ACE并合作增强。 ACE具有更好的通信API,基于OO设计模式,而boost具有类似“现代C ++”设计,并且适用于容器。

答案 9 :(得分:1)

我们开始使用ACE,认为它会隐藏TCP套接字和select调用中windows和unix之间存在的平台差异。事实证明,事实并非如此。 Ace取决于select,反应器模式,不能在Windows上混合套接字和stdin,并且有关套接字可写性通知的平台之间的语义差异仍然存在于ACE级别。

当我们意识到这一点时,我们已经在使用ACE的线程和进程功能(后者再次没有隐藏平台差异到我们想要的程度),所以我们的代码现在绑定到一个巨大的实际上阻​​止我们的代码移植到64位MinGW的库!

我迫不及待地等待代码中最后一次ACE使用被最终替换的那一天。

答案 10 :(得分:0)

我已经使用ACE多年了(8)但我刚刚开始调查我的下一个项目再次使用boost。我正在考虑增强,因为它有一个更大的工具包(正则表达式等),它的一部分被吸收到C ++标准中,因此长期维护应该更容易。 也就是说,提升需要一些调整。虽然Greg提到线程支持的侵入性较小,因为它可以运行任何(C或静态)函数,但如果您习惯使用的线程类更类似于ACE_Task提供的Java和C#线程类,那么使用一点技巧来提升同样的效果。