我使用boost :: io_service构建一个并行执行计算作业的线程池。有些作业不允许同时运行,我认为这是boost :: io_service :: strand的理想应用。由于顺序作业的执行顺序无关紧要,我问,使用我应该使用的链的两种方法中的哪一种:
strand.post(bind(jobA...));
或
io_service.post(strand.wrap(bind(jobA...)))
如果我理解正确的提升文档,第一个版本将确保作业按照发布的顺序执行,而第二个版本不提供任何保证。
我的问题是:哪一个更快?
答案 0 :(得分:2)
您可以互换使用上述两种方法,结果相同。我非常怀疑存在任何性能差异,但是如果存在,那就是两个函数(strand.post
vs io_service.post
)调用的开销,而不是{{1}的实际执行因为他们在引擎盖下做同样的事情并且具有相同的执行路径。
我猜想io_service
需要少量的时钟周期,但同样的呼吸我也猜测这种微优化在你的应用中是显而易见的,因为来自太阳辐射的干扰和CPU必须重新执行指令。我甚至不知道这是否是一个真实的现象,但是在试图想出一个冗长的说法,“不要担心它”时听起来很酷。如果确实存在性能差异,请分享基准。 *翻看自己的眼睛*
答案 1 :(得分:1)
就个人而言,我怀疑最终系统中的最终性能差异是可以检测到的,但是简单性与功能充分性相结合的争论是选项1。
它更易于理解,并且使用io_service
路线不会给你任何额外的功能,但必然,因为你通过一个额外的层 - io_service
- 间接添加额外的线路必须执行的代码。
docs for strand::post很明显,使用此方法已经在io_service
和strand
级别提供了必要的行为保证。