C++ 为什么ucontext的开销如此之高?
Boost v1.59中Boost.Context的文档报告了以下性能比较结果:C++ 为什么ucontext的开销如此之高?,c++,c,boost,ucontext,C++,C,Boost,Ucontext,Boost v1.59中Boost.Context的文档报告了以下性能比较结果: +----------+----------------------+-------------------+-------------------+----------------+ | Platform | ucontext_t | fcontext_t | execution_context | windows fibers | +----------+-----------
+----------+----------------------+-------------------+-------------------+----------------+
| Platform | ucontext_t | fcontext_t | execution_context | windows fibers |
+----------+----------------------+-------------------+-------------------+----------------+
| i386 | 708 ns / 754 cycles | 37 ns / 37 cycles | ns / cycles | ns / cycles |
| x86_64 | 547 ns / 1433 cycles | 8 ns / 23 cycles | 16 ns / 46 cycles | ns / cycles |
+----------+----------------------+-------------------+-------------------+----------------+
我相信
我的问题是,为什么Boost库实现的开销比Boost库实现的开销高20倍?我看不出有什么明显的原因会有如此大的差异。Boost实现是否使用了ucontext实现者错过的一些低级技巧,或者这里发生了其他事情?Boost文档说明了Boost.context比不推荐的ucontext\t接口更快的原因。在中,您将发现以下重要注意事项: 注 上下文开关不会在UNIX系统上保留信号掩码 与中的
makecontext
相比:
ucontext\u t在上下文切换之间保留信号掩码,这涉及到消耗大量CPU周期的系统调用
如前所述,swapcontext
确实保留了信号掩码,这需要一个系统调用和由此产生的所有开销。由于这正是ucontext\u t
函数的要点,因此不能将其描述为疏忽。(如果不想保留信号掩码,可以使用setjmp
和longjmp
)
顺便说一下,
,因为“现在很少有应用程序使用*context()例程”@noam:如果你将基于协程的应用程序转换为使用线程,那么你肯定已经用线程实现了你的协同程序,不是吗?但在我看来,这只是一个次要的语义问题。如果你真的觉得不舒服,我会改的。我不想为委员会的行为辩护,但我怀疑他们删除了接口,因为他们无法在实现之间就如何修复它们达成共识。很容易说,“如果我是独裁者,这就是我要强加的”:-,但Posix是一个不稳定的联盟,而不是独裁者,这限制了它的强制执行能力。我认为协同程序是指具体的用户级非先发制人线程,所以“如果你用线程实现了你的应用程序,那么你就用线程取代了协同程序”,但我明白你是如何把它理解为一件不同的事情的。(idk,如果严格来说,其中一种含义更为正确)。请随意保留答案,我只是感到失望,因为我将您的答案解释为有一种方法可以使用Posix线程使用户级非抢占线程。 void*