Speed of synchronized

Daniel Kozak via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Oct 17 05:09:43 PDT 2016


Dne 16.10.2016 v 10:41 Christian Köstlin via Digitalmars-d-learn napsal(a):
> Hi,
>
> for an exercise I had to implement a thread safe counter.
> This is what I came up with:
> ....
>
> btw. I run the code with dub run --build=release
>
> Thanks in advance,
> Christian
So I have done some testing, on my pc:
Java result
counter.AtomicLongCounter at 7ff5e7d8 expected: 2000000 got: 1000000 in: 83ms
counter.ThreadSafe2Counter at 59b44e4b expected: 2000000 got: 1000000 in: 77ms
counter.ThreadSafe1Counter at 2e5f6b4b expected: 2000000 got: 1000000 in: 154ms
counter.ThreadUnsafeCounter at 762b155d expected: 2000000 got: 730428 in: 13ms

and my D results (code: http://dpaste.com/3QFXACY ):
snip.AtomicCounter: got: 1000000 expected: 1000000 in 77 ms and 783 μs
snip.ThreadSafe1Counter: got: 1000000 expected: 1000000 in 287 ms, 727 
μs, and 3 hnsecs
snip.ThreadSafe2Counter: got: 1000000 expected: 1000000 in 281 ms, 117 
μs, and 1 hnsec
snip.ThreadSafe3Counter: got: 1000000 expected: 1000000 in 158 ms, 480 
μs, and 2 hnsecs
snip.ThreadUnsafeCounter: got: 1000000 expected: 1000000 in 6 ms, 682 
μs, and 1 hnsec

so atomic is same as in Java pthread_mutex is same speed as java 
synchronized
D mutexes and D synchronized are almost same, I belive that if I could 
setup same attrs as in pthread version it will be around 160ms too.

Unsafe is almost same for D and java. Only java ReentrantLock seems to 
work better. I believe there is some trick, so it will end up not using 
mutexes in the end at all. For example consider this change in D code:

void doIt(alias counter)() {
   auto thg = new ThreadGroup();
   for (int i=0; i<NR_OF_THREADS; ++i) {
      thg.create(&threadFuncBody!(counter));
   }
   thg.joinAll();
}

change it to

void doIt(alias counter)() {
   auto thg = new ThreadGroup();
   for (int i=0; i<NR_OF_THREADS; ++i) {
     auto tc = thg.create(&threadFuncBody!(counter));
     tc.join();
   }
}

and results are:

snip.AtomicCounter: got: 1000000 expected: 1000000 in 22 ms, 251 μs, and 
6 hnsecs
snip.ThreadSafe1Counter: got: 1000000 expected: 1000000 in 46 ms, 146 
μs, and 3 hnsecs
snip.ThreadSafe2Counter: got: 1000000 expected: 1000000 in 44 ms, 961 
μs, and 5 hnsecs
snip.ThreadSafe3Counter: got: 1000000 expected: 1000000 in 42 ms, 512 
μs, and 8 hnsecs
snip.ThreadUnsafeCounter: got: 1000000 expected: 1000000 in 2 ms, 108 
μs, and 5 hnsecs







More information about the Digitalmars-d-learn mailing list