そこにもっと速い種類はTMultiReadExclusiveWriteSynchronizer
ありますか?おそらくFastCode?
Windows Vista 以降、Microsoft はSlim Reader/Writer lockを追加しました。Delphiよりもはるかに優れたパフォーマンスを発揮しますTMultiReadExclusiveWriteSynchronizer
。残念ながら、これは Windows Vista 以降にしか存在せず、実際にまだほとんどのユーザーが持っていません。
おそらく、内部で使用されている概念はSlim Reader/Writer lock
、ネイティブの Delphi コードでやり直すことができますが、それを行った人はいますか?
TMultiReadExclusiveWriteSynchronizer
(競合がない場合でも、単一のスレッドで)ロックを取得および解放すると、 100%のオーバーヘッドが発生する(操作時間が2倍になる)状況があります。ロックせずに実行できますが、クラスはスレッドセーフではなくなります。
より速いものはありますTMultiReadExclusiveWriteSynchronizer
か?
注: i を使用するとTCriticalSection
、2% のパフォーマンス ヒットしか発生しません (ただし、取得が成功した場合、つまりシングル スレッドで競合がない場合、クリティカル セクションは高速であることが知られています)。CS の欠点は、「複数のリーダー」機能を失うことです。
測定
内部とTMultiReadExclusiveWriteSynchronizer
内部でかなりの時間を費やしています。BeginRead
EndRead
次に、Windows 独自のSlimReaderWriter Lockを使用するようにコードを移植し(再帰的なロックの取得をサポートしていないため、一部のコードを書き換えます)、結果をプロファイリングしました。
TMultiReadExclusiveWriteSynchronizer
: 反復ごと
に 10,698 ns 1,000,000 回反復するには 10,697,772,613 nsSRWLock
: 反復ごとに 8,802 ns
1,000,000 回反復するには 8,801,678,339 nsOmni Reader-Writer lock
: 反復ごとに 8,941 ns
1,000,000 回反復するには 8,940,552,487 ns
SRWLocks (別名 Omni の回転ロック) を使用すると 17% の改善。
現在、まだ Windows XP を使用している企業全体が存在するため、Windows Vista SRWLocksを使用するようにコードを永続的に切り替えることはできません。
スリムロックは、InterlockedCompareExchange
機能を慎重に使用するだけです。しかし、私がうまく使用できるよりも慎重です。関係する 140 の機械語命令を盗むには程遠いです。