zookeeper-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Abraham Fine (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (ZOOKEEPER-2790) Should we consider using `LongAdder` instead of `AtomicLong`
Date Tue, 30 May 2017 20:13:06 GMT

    [ https://issues.apache.org/jira/browse/ZOOKEEPER-2790?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16030052#comment-16030052
] 

Abraham Fine commented on ZOOKEEPER-2790:
-----------------------------------------

Hi [~benedict jin]-

My understanding is that `LongAdder` and `AtomicLong` perform similarly under low contention
and `LongAdder` uses more memory.

Which usages of `AtomicLong` do you think cause enough performance problems to justify this
change?

>  Should we consider using `LongAdder` instead of `AtomicLong`
> -------------------------------------------------------------
>
>                 Key: ZOOKEEPER-2790
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2790
>             Project: ZooKeeper
>          Issue Type: Improvement
>          Components: server
>    Affects Versions: 3.5.3
>            Reporter: Benedict Jin
>             Fix For: 4.0.0
>
>
> ```java
> // -Xmx512M -Xms512M -Xmn256M -XX:+AlwaysPreTouch -ea
> @Test
> public void pressureLongAdder() throws Exception {
>     final LongAdder longAdder = new LongAdder();
>     ExecutorService executorService = Executors.newCachedThreadPool();
>     long startTime = System.currentTimeMillis();
>     for (int i = 0; i < 100; i++) {
>         executorService.submit(new Thread(() -> {
>             for (int j = 0; j < 1000_0000; j++) {
>                 longAdder.increment();
>             }
>             System.out.print(String.format("%s %s \t", Thread.currentThread().getId(),
longAdder.longValue()));
>             /*
>             14 19607585 	12 36445036 	20 38985288 	38 76821270 	70 117094732 	18 127252576
>             22 137043349 	26 153411172 	30 164051380 	34 165971155 	102 192241678 	134
201104979
>             158 232657818 	46 279030056 	174 288502545 	94 347965290 	198 348060553 
118 348087414
>             36 353092712 	28 357762215 	44 365464475 	126 379518198 	54 379623515 	182
380077075
>             142 385263911 	78 389013887 	62 389085727 	110 389122678 	86 389920423 	166
393535019
>             150 396382512 	190 403100499 	32 403161217 	208 403197689 	206 406065520
	16 410725026
>             24 415347205 	40 415379997 	48 415733397 	104 418507295 	192 423244160 	176
455793362
>             168 458311865 	160 463028656 	136 496375440 	72 541243645 	186 561877000
	170 575352229
>             162 584152392 	154 604552121 	138 614092854 	64 638151890 	114 668705836
	58 669235250
>             188 699213410 	156 729222401 	124 754336889 	100 784326386 	76 813479501
	120 827569944
>             66 830236567 	98 832153503 	112 841408676 	204 849520891 	210 852391130 
202 864804732
>             172 875603834 	194 877222893 	200 881090909 	88 882809513 	80 882846368 
56 887174571
>             178 889682247 	140 901357028 	146 902169049 	184 904540678 	152 915608988
	130 917896629
>             116 924616135 	144 927674541 	122 930399321 	128 939791111 	106 942656234
	84 950848174
>             96 951904067 	90 954910184 	74 964338213 	196 966487766 	82 968307139 	52
975854400
>             180 977385398 	164 978882525 	50 980896807 	148 988292352 	132 989090669
	108 996891232
>             92 996921398 	42 996938988 	68 996953941 	60 1000000000
>              */
>         }));
>     }
>     executorService.shutdown();
>     while (!executorService.isTerminated()) {
>         Thread.sleep(1);
>     }
>     long endTime = System.currentTimeMillis();
>     System.out.println("\n" + (endTime - startTime));    // 3275 ms
> }
> // -Xmx512M -Xms512M -Xmn256M -XX:+AlwaysPreTouch -ea
> @Test
> public void pressureAtomicLong() throws Exception {
>     final AtomicLong atomicLong = new AtomicLong();
>     ExecutorService executorService = Executors.newCachedThreadPool();
>     long startTime = System.currentTimeMillis();
>     for (int i = 0; i < 100; i++) {
>         executorService.submit(new Thread(() -> {
>             for (int j = 0; j < 1000_0000; j++) {
>                 atomicLong.getAndIncrement();
>             }
>             System.out.print(String.format("%s %s \t", Thread.currentThread().getId(),
atomicLong.longValue()));
>             /*
>             12 390000000 	28 390000000 	44 390000000 	20 390000000 	26 390000000 	18
390000000
>             80 390000000 	56 390000000 	96 390000000 	24 390000000 	88 390000000 	72
390000000
>             22 390000000 	118 390000000 	54 390000000 	142 390000000 	70 390000000 	86
390000000
>             182 390000000 	110 390000000 	62 390000000 	78 390000000 	102 390000000 
158 390000000
>             150 390000000 	46 390000000 	38 390000000 	126 390000000 	94 390000000 	134
390000000
>             14 390000000 	48 390000000 	40 390000000 	32 390000000 	34 390000000 	64
390000000
>             42 390000000 	36 390000000 	16 390000000 	180 416396554 	204 419908287 	196
425536497
>             92 732203658 	30 733835560 	202 733835559 	210 733873571 	146 733878564 
186 733883527
>             170 733888686 	76 733892691 	84 733888815 	148 733901560 	162 733907032 
172 733908079
>             52 733913280 	116 733918421 	124 733906868 	164 733920945 	132 733891348
	68 733923672
>             108 733924928 	156 733926091 	60 733921998 	140 733927257 	188 733928891
	154 733871822
>             194 733830477 	178 733872527 	100 733830322 	106 748251688 	144 1000000000
	98 1000000000
>             58 1000000000 	90 1000000000 	130 1000000000 	138 1000000000 	114 1000000000
	104 1000000000
>             168 1000000000 	200 1000000000 	184 1000000000 	160 1000000000 	174 1000000000
	112 1000000000
>             190 1000000000 	198 1000000000 	82 1000000000 	206 1000000000 	166 1000000000
	176 1000000000
>             136 1000000000 	208 1000000000 	74 1000000000 	122 1000000000 	152 1000000000
	192 1000000000
>             120 1000000000 	128 1000000000 	66 1000000000 	50 1000000000
>              */
>         }));
>     }
>     executorService.shutdown();
>     while (!executorService.isTerminated()) {
>         Thread.sleep(1);
>     }
>     long endTime = System.currentTimeMillis();
>     System.out.println("\n" + (endTime - startTime));    // 19409 ms
> }
> ```



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Mime
View raw message