Locking Comparison
Posted: Sat Aug 08, 2015 1:49 am
mutex_tester.pb
slim_read_write_lock.pb
critical_section.pb
Results:
Mutex Tester, thread 6 complete, time elapsed in ms = 320
Mutex Tester, thread 0 complete, time elapsed in ms = 336
Mutex Tester, thread 9 complete, time elapsed in ms = 337
Mutex Tester, thread 3 complete, time elapsed in ms = 341
Mutex Tester, thread 7 complete, time elapsed in ms = 349
Mutex Tester, thread 2 complete, time elapsed in ms = 368
Mutex Tester, thread 5 complete, time elapsed in ms = 370
Mutex Tester, thread 4 complete, time elapsed in ms = 371
Mutex Tester, thread 1 complete, time elapsed in ms = 376
Mutex Tester, thread 8 complete, time elapsed in ms = 376
Average for Mutex Tester: 354.4 ms
Slim Read Writer Lock Tester, thread 8 complete, time elapsed in ms = 50
Slim Read Writer Lock Tester, thread 1 complete, time elapsed in ms = 99
Slim Read Writer Lock Tester, thread 0 complete, time elapsed in ms = 132
Slim Read Writer Lock Tester, thread 6 complete, time elapsed in ms = 135
Slim Read Writer Lock Tester, thread 2 complete, time elapsed in ms = 136
Slim Read Writer Lock Tester, thread 7 complete, time elapsed in ms = 169
Slim Read Writer Lock Tester, thread 3 complete, time elapsed in ms = 173
Slim Read Writer Lock Tester, thread 9 complete, time elapsed in ms = 180
Slim Read Writer Lock Tester, thread 4 complete, time elapsed in ms = 181
Slim Read Writer Lock Tester, thread 5 complete, time elapsed in ms = 196
Average for Slim Read Writer Lock Tester: 145.1 ms
Critical Section Tester, thread 3 complete, time elapsed in ms = 281
Critical Section Tester, thread 0 complete, time elapsed in ms = 297
Critical Section Tester, thread 6 complete, time elapsed in ms = 300
Critical Section Tester, thread 7 complete, time elapsed in ms = 303
Critical Section Tester, thread 2 complete, time elapsed in ms = 304
Critical Section Tester, thread 9 complete, time elapsed in ms = 337
Critical Section Tester, thread 8 complete, time elapsed in ms = 352
Critical Section Tester, thread 5 complete, time elapsed in ms = 360
Critical Section Tester, thread 4 complete, time elapsed in ms = 363
Critical Section Tester, thread 1 complete, time elapsed in ms = 363
Average for Critical Section Tester: 326 ms.
Slim Reader Writer appears to be twice as fast as Critical Section and Mutex.
Code: Select all
EnableExplicit
OpenConsole()
Global globalPointer.i
Global sharedInteger.i = 0
Global startTime.i = ElapsedMilliseconds()
Global Dim checkCounter.i(20000000)
Define loopIndex.i
globalPointer = CreateMutex()
Procedure incrementInteger(sessionNumber.i)
Protected threadIndex.i
Protected finishTime.i
For threadIndex=1 To 1000000
LockMutex(globalPointer)
sharedInteger + 1
If checkCounter(sharedInteger) = 0
checkCounter(sharedInteger) = 1
Else
PrintN("Crash occurred setting counter # " + Str(sharedInteger))
Input()
EndIf
UnlockMutex(globalPointer)
Next
finishTime = ElapsedMilliseconds() - startTime
PrintN("Mutex Tester, thread " + Str(sessionNumber) + " complete, time elapsed in ms = " + Str(finishTime))
EndProcedure
For loopIndex=0 To 9
CreateThread(@incrementInteger(), loopIndex)
Next
Input()
CloseConsole()
; IDE Options = PureBasic 5.24 LTS (Windows - x64)
; ExecutableFormat = Console
; CursorPosition = 30
; EnableThread
; Executable = mutex_tester.exe
; DisableDebugger
; CompileSourceDirectory
Code: Select all
EnableExplicit
OpenConsole()
Global *globalPointer = AllocateMemory(SizeOf(Integer))
Global sharedInteger.i = 0
Global startTime.i = ElapsedMilliseconds()
Global Dim checkCounter.i(20000000)
Define loopIndex.i
Import "D:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\kernel32.lib"
InitializeSRWLock(*globalPointer)
TryAcquireSRWLockShared(*globalPointer)
AcquireSRWLockShared(*globalPointer)
ReleaseSRWLockShared(*globalPointer)
TryAcquireSRWLockExclusive(*globalPointer)
AcquireSRWLockExclusive(*globalPointer)
ReleaseSRWLockExclusive(*globalPointer)
EndImport
InitializeSRWLock(*globalPointer)
OpenConsole()
Procedure incrementInteger(sessionNumber.i)
Protected threadIndex.i
Protected finishTime.i
For threadIndex=1 To 1000000
AcquireSRWLockExclusive(*globalPointer)
sharedInteger + 1
If checkCounter(sharedInteger) = 0
checkCounter(sharedInteger) = 1
Else
PrintN("Crash occurred setting counter # " + Str(sharedInteger))
Input()
EndIf
ReleaseSRWLockExclusive(*globalPointer)
Next
finishTime = ElapsedMilliseconds() - startTime
PrintN("Slim Read Writer Lock Tester, thread " + Str(sessionNumber) + " complete, time elapsed in ms = " + Str(finishTime))
EndProcedure
For loopIndex=0 To 9
CreateThread(@incrementInteger(), loopIndex)
Next
Input()
CloseConsole()
; IDE Options = PureBasic 5.24 LTS (Windows - x64)
; ExecutableFormat = Console
; CursorPosition = 42
; EnableThread
; Executable = slim_read_write_lock.exe
; DisableDebugger
; CompileSourceDirectory
Code: Select all
EnableExplicit
OpenConsole()
Global *globalPointer = AllocateMemory(SizeOf(Integer))
Global sharedInteger.i = 0
Global startTime.i = ElapsedMilliseconds()
Global Dim checkCounter.i(20000000)
Define loopIndex.i
InitializeCriticalSection_(*globalPointer)
Procedure incrementInteger(sessionNumber.i)
Protected threadIndex.i
Protected finishTime.i
For threadIndex=1 To 1000000
EnterCriticalSection_(*globalPointer)
sharedInteger + 1
If checkCounter(sharedInteger) = 0
checkCounter(sharedInteger) = 1
Else
PrintN("Crash occurred setting counter # " + Str(sharedInteger))
Input()
EndIf
LeaveCriticalSection_(*globalPointer)
Next
finishTime = ElapsedMilliseconds() - startTime
PrintN("Critical Section Tester, thread " + Str(sessionNumber) + " complete, time elapsed in ms = " + Str(finishTime))
EndProcedure
For loopIndex=0 To 9
CreateThread(@incrementInteger(), loopIndex)
Next
Input()
CloseConsole()
; IDE Options = PureBasic 5.24 LTS (Windows - x64)
; ExecutableFormat = Console
; CursorPosition = 12
; EnableThread
; Executable = critical_section.exe
; DisableDebugger
; CompileSourceDirectory
Mutex Tester, thread 6 complete, time elapsed in ms = 320
Mutex Tester, thread 0 complete, time elapsed in ms = 336
Mutex Tester, thread 9 complete, time elapsed in ms = 337
Mutex Tester, thread 3 complete, time elapsed in ms = 341
Mutex Tester, thread 7 complete, time elapsed in ms = 349
Mutex Tester, thread 2 complete, time elapsed in ms = 368
Mutex Tester, thread 5 complete, time elapsed in ms = 370
Mutex Tester, thread 4 complete, time elapsed in ms = 371
Mutex Tester, thread 1 complete, time elapsed in ms = 376
Mutex Tester, thread 8 complete, time elapsed in ms = 376
Average for Mutex Tester: 354.4 ms
Slim Read Writer Lock Tester, thread 8 complete, time elapsed in ms = 50
Slim Read Writer Lock Tester, thread 1 complete, time elapsed in ms = 99
Slim Read Writer Lock Tester, thread 0 complete, time elapsed in ms = 132
Slim Read Writer Lock Tester, thread 6 complete, time elapsed in ms = 135
Slim Read Writer Lock Tester, thread 2 complete, time elapsed in ms = 136
Slim Read Writer Lock Tester, thread 7 complete, time elapsed in ms = 169
Slim Read Writer Lock Tester, thread 3 complete, time elapsed in ms = 173
Slim Read Writer Lock Tester, thread 9 complete, time elapsed in ms = 180
Slim Read Writer Lock Tester, thread 4 complete, time elapsed in ms = 181
Slim Read Writer Lock Tester, thread 5 complete, time elapsed in ms = 196
Average for Slim Read Writer Lock Tester: 145.1 ms
Critical Section Tester, thread 3 complete, time elapsed in ms = 281
Critical Section Tester, thread 0 complete, time elapsed in ms = 297
Critical Section Tester, thread 6 complete, time elapsed in ms = 300
Critical Section Tester, thread 7 complete, time elapsed in ms = 303
Critical Section Tester, thread 2 complete, time elapsed in ms = 304
Critical Section Tester, thread 9 complete, time elapsed in ms = 337
Critical Section Tester, thread 8 complete, time elapsed in ms = 352
Critical Section Tester, thread 5 complete, time elapsed in ms = 360
Critical Section Tester, thread 4 complete, time elapsed in ms = 363
Critical Section Tester, thread 1 complete, time elapsed in ms = 363
Average for Critical Section Tester: 326 ms.
Slim Reader Writer appears to be twice as fast as Critical Section and Mutex.