Locking Comparison

Windows specific forum
User avatar
RichAlgeni
Addict
Addict
Posts: 935
Joined: Wed Sep 22, 2010 1:50 am
Location: Bradenton, FL

Locking Comparison

Post by RichAlgeni »

mutex_tester.pb

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
slim_read_write_lock.pb

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
critical_section.pb

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
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.