Speed of synchronized

Christian Köstlin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Oct 17 05:44:19 PDT 2016


On 17/10/16 14:09, Daniel Kozak via Digitalmars-d-learn wrote:
> 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
> 
> 
> 
> 
> 
thank you for looking into it.
this seems to be quite good.
I did expect something in those lines, but got the mentioned numbers on
my os x macbook. perhaps its a os x glitch.



More information about the Digitalmars-d-learn mailing list