Есть ли более быстрый вид 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 машинных инструкций и сделать это.