有没有更快的TMultiReadExclusiveWriteSynchronizer
类型呢?比如FastCode?
从Windows Vista开始,微软添加了Slim Reader/Writer lock。它比Delphi的TMultiReadExclusiveWriteSynchronizer表现更好。不幸的是,它只存在于Windows Vista及以后版本中,而这些版本的客户并不多。
可以假设在Slim Reader/Writer lock
内使用的概念可以在本地Delphi代码中重新实现,但是否有人已经这样做了呢?
我遇到了这样一种情况:获取和释放TMultiReadExclusiveWriteSynchronizer
上的锁(即使没有争用-单个线程),会导致100%的开销(操作时间加倍)。我可以不锁定运行,但这时我的类就不再是线程安全的。
我需要翻译的内容是:“是否有更快的TMultiReadExclusiveWriteSynchronizer?” 注意:如果我使用TCriticalSection,只会导致2%的性能损失(尽管在获取成功时,即单线程且没有争用时,临界区被认为是快速的。)。 CS的缺点是我失去了“多个读取器”的功能。
测量结果
使用TMultiReadExclusiveWriteSynchronizer,在BeginRead和EndRead内花费了相当多的时间:
我接着将代码移植到使用Windows自己的SlimReaderWriter Lock(需要进行一些代码重写,因为它不支持递归锁定),并对结果进行了分析:TMultiReadExclusiveWriteSynchronizer
: 每次迭代耗时10,698纳秒
迭代1,000,000次总计耗时10,697,772,613纳秒SRWLock
: 每次迭代耗时8,802纳秒
迭代1,000,000次总计耗时8,801,678,339纳秒Omni Reader-Writer lock
: 每次迭代耗时8,941纳秒
迭代1,000,000次总计耗时8,940,552,487纳秒
现在,我无法永久切换代码以使用Windows Vista SRWLocks,因为还有一些企业客户仍在使用Windows XP。
这个“Slim locks”只是小心谨慎地使用了InterlockedCompareExchange
函数; 但比我能够成功使用的更加小心谨慎。 我距离窃取所涉及的 140 条机器指令并使其完成还有很远的路要走。