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