I tried enclosed tests of various Counters on i3 530 CPU (2 cores, 4 threads) with Linux 2.6.32.21 (Fedora 12) using 64bit JDK_1.6.0_u23-b01 and got the following results for 1 … 4 concurrent threads:
as can be seen, when number of concurrent threads is 3 or 4, CAT expands to max. size (1M entries). I don't think this is expected behavior. Is it possible that hash codes of threads are stumbling on the same entry? Would using some kind of random generator instead of hash work better? Is it, performance wise, necessary that the same thread always updates the same entry?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I tried enclosed tests of various Counters on i3 530 CPU (2 cores, 4 threads) with Linux 2.6.32.21 (Fedora 12) using 64bit JDK_1.6.0_u23-b01 and got the following results for 1 … 4 concurrent threads:
==== Counter Threads Trial: 0 1 2 3 4 5 6 Average
=== Racey 1 cnts/sec= 174582154 172331506 174543437 169797305 172630640 176269573 172631384 173343824 (+/- 0%)
=== Synchroniz 1 cnts/sec= 150224074 40323011 40302822 40046079 40137587 40210296 39858442 40203959 (+/- 0%)
=== Lock 1 cnts/sec= 41800010 42176995 42688922 41417759 41880942 41890417 42081903 41966053 (+/- 0%)
=== Atomic 1 cnts/sec= 97321080 99035295 99994441 97948600 96548048 96502927 96983510 97567306 (+/- 0%)
=== Unsafe 1 cnts/sec= 95654076 96647880 98033608 99634414 96931043 98900675 97995096 97701660 (+/- 0%)
=== Locks8 1 cnts/sec= 42245350 42522368 43264504 43460192 43717578 43639354 43498521 43276987 (+/- 1%)
=== Unsafes8 1 cnts/sec= 90509422 89159348 88034754 88833596 89220516 88718540 86318425 88793350 (+/- 1%)
=== Locks64 1 cnts/sec= 42297247 41488534 41198220 43214971 43124756 42117236 42955847 42396724 (+/- 1%)
=== Unsafes64 1 cnts/sec= 89864962 89640970 87093285 89093586 87579167 88029178 88589504 88586481 (+/- 0%)
=== Locks256 1 cnts/sec= 43251196 43166971 42471052 43524552 42090851 43017135 41957039 42799441 (+/- 1%)
=== Unsafes256 1 cnts/sec= 90135282 88594385 84825765 85864439 90111458 85463215 88729280 87752555 (+/- 2%)
=== CAT 1 cnts/sec= 65465072 65297659 66086961 65903432 63835001 65776610 65222028 65532960 (+/- 0%) autotable=4
=== Racey 2 cnts/sec= 128883320 127184027 120205525 174069280 126343980 131054720 129061745 128505558 (+/- 1%) Lossage=34%
=== Synchroniz 2 cnts/sec= 13027752 12886771 12593047 12907497 13261349 11741289 11954280 12673869 (+/- 3%)
=== Lock 2 cnts/sec= 8395723 6812267 7014704 6759235 6989208 7443996 7068110 7065657 (+/- 3%)
=== Atomic 2 cnts/sec= 31937137 30874855 31022211 30434022 30846262 33499313 32137057 31363504 (+/- 1%)
=== Unsafe 2 cnts/sec= 31625173 32179171 32005418 32565285 31966302 31983351 31036366 31951883 (+/- 1%)
=== Locks8 2 cnts/sec= 21084536 9178211 18261025 21502774 22862184 27517642 7644833 18577746 (+/-29%)
=== Unsafes8 2 cnts/sec= 163470332 50263216 166117667 51944040 166160913 165682810 165290308 142501031 (+/-35%)
=== Locks64 2 cnts/sec= 52653927 52685244 52304573 53224481 8210129 52606674 52074458 52464975 (+/- 0%)
=== Unsafes64 2 cnts/sec= 164359698 149042499 166001770 50724033 51453207 165663172 164692145 139042144 (+/-35%)
=== Locks256 2 cnts/sec= 52899891 53055855 40609142 81217212 48357365 82221242 45799032 56265871 (+/-25%)
=== Unsafes256 2 cnts/sec= 168276262 155333254 163560928 156469718 165599918 49172630 166737152 161540194 (+/- 3%)
=== CAT 2 cnts/sec= 42492510 43595010 42529424 42136975 124316905 124247647 121787665 74930451 (+/-58%) autotable=32
=== Racey 3 cnts/sec= 107665245 107613222 107554640 107489699 106624690 105933888 108420183 107389499 (+/- 0%) Lossage=32%
=== Synchroniz 3 cnts/sec= 12659833 12955152 13495288 12862205 12417548 12565035 12901410 12788727 (+/- 1%)
=== Lock 3 cnts/sec= 25421409 25525911 25263660 25658832 26315497 24743606 25255355 25425033 (+/- 0%)
=== Atomic 3 cnts/sec= 40466024 40229925 41524133 40772651 41377516 40903343 40448405 40793587 (+/- 0%)
=== Unsafe 3 cnts/sec= 29473844 28932083 28765839 30040765 29600018 29251665 28587641 29204689 (+/- 1%)
=== Locks8 3 cnts/sec= 14688433 19526585 17455927 29560512 23799844 17653716 27649120 21217038 (+/-20%)
=== Unsafes8 3 cnts/sec= 40521202 146536710 125687358 58480251 55423687 50263573 32466038 66075214 (+/-55%)
=== Locks64 3 cnts/sec= 60754228 61547197 62515697 60329581 60504048 58383639 60511137 60729238 (+/- 0%)
=== Unsafes64 3 cnts/sec= 188769431 187287238 173712626 187042222 186287932 187214960 189798719 187320356 (+/- 0%)
=== Locks256 3 cnts/sec= 61404559 47677137 61900587 59829155 59807018 51824031 24245384 56108380 (+/-28%)
=== Unsafes256 3 cnts/sec= 172165694 179076371 182470845 185248642 188199978 176829721 103478799 179158254 (+/-19%)
=== CAT 3 cnts/sec= 141011528 136192352 141655642 140510363 141128489 77652182 124366567 136641859 (+/- 5%) autotable=1048576
=== Racey 4 cnts/sec= 94025616 94459126 90501794 95256139 94334092 95284307 92107312 94036457 (+/- 1%) Lossage=32%
=== Synchroniz 4 cnts/sec= 11017771 11068765 11513973 10989585 11192265 10642630 10968810 11047439 (+/- 0%)
=== Lock 4 cnts/sec= 30231202 30032748 28026965 26484092 29463922 28584743 34863873 29267916 (+/- 3%)
=== Atomic 4 cnts/sec= 30761897 29545098 28133071 30476227 29801007 30674069 30122017 30123683 (+/- 1%)
=== Unsafe 4 cnts/sec= 32737541 31661982 30161838 31592804 33390566 32163137 32205390 32072170 (+/- 1%)
=== Locks8 4 cnts/sec= 47130129 27328840 29901784 29586629 25161070 32429166 39374268 31724137 (+/-14%)
=== Unsafes8 4 cnts/sec= 115947804 180882936 105780325 72180768 60903892 158988721 113088480 113197219 (+/-27%)
=== Locks64 4 cnts/sec= 71792081 34648289 88048657 57618637 48478239 60226142 78962496 63415519 (+/-18%)
=== Unsafes64 4 cnts/sec= 190884092 193742534 190100152 167265300 85238445 114576122 196290517 171313640 (+/-19%)
=== Locks256 4 cnts/sec= 70589306 62749642 55894570 70973688 67874402 71074676 59688189 66375045 (+/- 7%)
=== Unsafes256 4 cnts/sec= 192896171 199087743 198525414 196480958 191121824 189160610 200151034 195622422 (+/- 1%)
=== CAT 4 cnts/sec= 77581061 151831959 146813847 150717267 99802179 105543897 149705964 130516630 (+/-19%) autotable=1048576
as can be seen, when number of concurrent threads is 3 or 4, CAT expands to max. size (1M entries). I don't think this is expected behavior. Is it possible that hash codes of threads are stumbling on the same entry? Would using some kind of random generator instead of hash work better? Is it, performance wise, necessary that the same thread always updates the same entry?