Существует ли более быстрый тип TMultiReadExclusiveWriteSynchronizer
? Возможно, FastCode?
Начиная с Windows Vista, Microsoft добавила блокировку Slim Reader/Writer . Он работает намного лучше , чем Delphi TMultiReadExclusiveWriteSynchronizer
. К сожалению, он существует только в Windows Vista и более поздних версиях, что на самом деле есть у немногих клиентов.
Предположительно, концепции, используемые внутри Slim Reader/Writer lock
, могут быть переделаны в собственном коде Delphi -, но кто-нибудь делал это?
У меня возникла ситуация, когда получение и снятие блокировки наTMultiReadExclusiveWriteSynchronizer
(даже при отсутствии конфликтов -одного потока )вызывает 100% накладных расходов (время операции удваивается ). я могу работать без блокировки, но тогда мой класс больше не является потокобезопасным -.
Есть ли более быстрый TMultiReadExclusiveWriteSynchronizer
?
Примечание.:Если я использую TCriticalSection
, я теряю только 2% производительности (, хотя известно, что критические секции работают быстро, когда получение успешно, т.е. спора нет ). Недостатком CS является то, что я теряю возможность «нескольких читателей ».
Используя TMultiReadExclusiveWriteSynchronizer
значительное количество времени было потрачено внутри BeginRead
иEndRead
:
затем я перенес код для использования собственного SlimReaderWriter Lock (, который переписал код, как он не поддерживает рекурсивное получение блокировки )и профилирует результаты:
TMultiReadExclusiveWriteSynchronizer
:10 698 нс за итерацию
10 697 772 613 нс для повторения 1 000 000 раз
SRWLock
:8 802 нс на итерацию
8 801 678 339 нс для повторения 1 000 000 раз
Omni Reader-Writer lock
:8 941 нс на итерацию
8 940 552 487 нс для повторения 1 000 000 раз
Улучшение на 17% при использовании SRWLocks (, также известного как вращающаяся блокировка Omni ).
Теперь я не могу навсегда переключить код на использование Windows Vista SRWLocks , так как некоторые целые предприятия клиентов все еще используют Windows XP.
Замки Slim — это просто аккуратное использование InterlockedCompareExchange
функций;но более осторожным, чем я могу успешно использовать. Я это далек от того, чтобы просто украсть 140 задействованных машинных инструкций, и сделал это.