10.5.5 TSS的性能
到目前为止我们还没有提及性能问题。当然,库的成熟和周全性,加上使用了互斥体来串行化对存储区的访问,这两个事实都意味着该库跟Win32的TLS实现相比代价要显著得多。Win32 TLS确实非常快[Wils2003f]。从某种意义上说,这不是问题,因为如果你需要这种功能的话,你就无可避免地要付出代价。其次,线程切换的代价是相当可观的,也许可达上千个时钟周期[Bulk1999],因此TSS中某些实现的开销相比之下可能不足为虑。然而,我们也不能忽视这个问题。有一种手段可以被用来最小化Tss库或任何TSS API的开销:将TSS数据沿着调用链往下传递,而不是让每一层都自己去获取它们,后一种做法由于TSS基础设施中的竞争条件从而可能会导致剧烈的上下文切换。显然这种开销的最小化在系统库函数或其他被普遍使用的函数中无法实现,但是在你自己的应用程序的实现中还是可能的。
此外,对于Tss存储,使用TssSlotScope模板是个不错的选择,因为它仅在槽位值需要被改变时才会去更新它。
一如既往,策略的选择依然取决于你自己,取决于你对性能、健壮性、编程(www.cppentry.com)难易程度以及所需的功能之间的权衡。