import java.util.concurrent.TimeUnit ;
import java.util.concurrent.atomic.AtomicLong ;
class Ideone {
public static void main
( String [ ] args
) { final int n = 100 ;
final int k = 100000 ;
long elap;
elap = 0 ;
for ( int i = 0 ; i < n; i++ ) {
elap += testPlain( k) ;
}
System .
out .
printf ( "for (1 .. %d) { for (1 .. %d) <count with %s> }: avg=%d (total=%d) in millis%n" , n, k,
"+=" , TimeUnit.
MILLISECONDS .
convert ( elap
/ n, TimeUnit.
NANOSECONDS ) , TimeUnit.
MILLISECONDS .
convert ( elap, TimeUnit.
NANOSECONDS ) ) ;
elap = 0 ;
for ( int i = 0 ; i < n; i++ ) {
elap += testSynchronized( k) ;
}
System .
out .
printf ( "for (1 .. %d) { for (1 .. %d) <count with %s> }: avg=%d (total=%d) in millis%n" , n, k,
"synchronized(+=)" , TimeUnit.
MILLISECONDS .
convert ( elap
/ n, TimeUnit.
NANOSECONDS ) , TimeUnit.
MILLISECONDS .
convert ( elap, TimeUnit.
NANOSECONDS ) ) ;
elap = 0 ;
for ( int i = 0 ; i < n; i++ ) {
elap += testAtomicLong( k) ;
}
System .
out .
printf ( "for (1 .. %d) { for (1 .. %d) <count with %s> }: avg=%d (total=%d) in millis%n" , n, k,
"AtomicLong#addAndGet" , TimeUnit.
MILLISECONDS .
convert ( elap
/ n, TimeUnit.
NANOSECONDS ) , TimeUnit.
MILLISECONDS .
convert ( elap, TimeUnit.
NANOSECONDS ) ) ; }
static void nullmethod( final long l) {
}
static long testPlain( final int n) {
final long begin
= System .
nanoTime ( ) ; long sum = 0 ;
for ( int i = 0 ; i < n; i++ ) {
sum += i;
}
nullmethod( sum) ;
return System .
nanoTime ( ) - begin
; }
static long testSynchronized( final int n) {
final long begin
= System .
nanoTime ( ) ; long sum = 0 ;
for ( int i = 0 ; i < n; i++ ) {
synchronized ( Ideone.class ) {
sum += i;
}
}
nullmethod( sum) ;
return System .
nanoTime ( ) - begin
; }
static long testAtomicLong( final int n) {
final long begin
= System .
nanoTime ( ) ; AtomicLong sum = new AtomicLong( ) ;
for ( int i = 0 ; i < n; i++ ) {
sum.addAndGet ( i) ;
}
nullmethod( sum.get ( ) ) ;
return System .
nanoTime ( ) - begin
; }
}
CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwoKCmNsYXNzIElkZW9uZSB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJZmluYWwgaW50IG4gPSAxMDA7CgkJZmluYWwgaW50IGsgPSAxMDAwMDA7CgkJbG9uZyBlbGFwOwoJCQoJCWVsYXAgPSAwOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJCWVsYXAgKz0gdGVzdFBsYWluKGspOwoJCX0KCQlTeXN0ZW0ub3V0LnByaW50ZigiZm9yICgxIC4uICVkKSB7IGZvciAoMSAuLiAlZCkgPGNvdW50IHdpdGggJXM+IH06IGF2Zz0lZCAodG90YWw9JWQpIGluIG1pbGxpcyVuIiwgbiwgaywgIis9IiwgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoZWxhcCAvIG4sIFRpbWVVbml0Lk5BTk9TRUNPTkRTKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoZWxhcCwgVGltZVVuaXQuTkFOT1NFQ09ORFMpKTsKCQkKCQllbGFwID0gMDsKCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewoJCQllbGFwICs9IHRlc3RTeW5jaHJvbml6ZWQoayk7CgkJfQoJCVN5c3RlbS5vdXQucHJpbnRmKCJmb3IgKDEgLi4gJWQpIHsgZm9yICgxIC4uICVkKSA8Y291bnQgd2l0aCAlcz4gfTogYXZnPSVkICh0b3RhbD0lZCkgaW4gbWlsbGlzJW4iLCBuLCBrLCAic3luY2hyb25pemVkKCs9KSIsIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KGVsYXAgLyBuLCBUaW1lVW5pdC5OQU5PU0VDT05EUyksIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KGVsYXAsIFRpbWVVbml0Lk5BTk9TRUNPTkRTKSk7CgkJCgkJZWxhcCA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQkJZWxhcCArPSB0ZXN0QXRvbWljTG9uZyhrKTsKCQl9CgkJU3lzdGVtLm91dC5wcmludGYoImZvciAoMSAuLiAlZCkgeyBmb3IgKDEgLi4gJWQpIDxjb3VudCB3aXRoICVzPiB9OiBhdmc9JWQgKHRvdGFsPSVkKSBpbiBtaWxsaXMlbiIsIG4sIGssICJBdG9taWNMb25nI2FkZEFuZEdldCIsIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KGVsYXAgLyBuLCBUaW1lVW5pdC5OQU5PU0VDT05EUyksIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KGVsYXAsIFRpbWVVbml0Lk5BTk9TRUNPTkRTKSk7Cgl9CgkKCXN0YXRpYyB2b2lkIG51bGxtZXRob2QoZmluYWwgbG9uZyBsKSB7CgkJCgl9CgkKCXN0YXRpYyBsb25nIHRlc3RQbGFpbihmaW5hbCBpbnQgbikgewoJCWZpbmFsIGxvbmcgYmVnaW4gPSBTeXN0ZW0ubmFub1RpbWUoKTsKCQlsb25nIHN1bSA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQkJc3VtICs9IGk7CgkJfQoJCW51bGxtZXRob2Qoc3VtKTsKCQlyZXR1cm4gU3lzdGVtLm5hbm9UaW1lKCkgLSBiZWdpbjsKCX0KCQoJc3RhdGljIGxvbmcgdGVzdFN5bmNocm9uaXplZChmaW5hbCBpbnQgbikgewoJCWZpbmFsIGxvbmcgYmVnaW4gPSBTeXN0ZW0ubmFub1RpbWUoKTsKCQlsb25nIHN1bSA9IDA7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKCQkJc3luY2hyb25pemVkIChJZGVvbmUuY2xhc3MpIHsKCQkJCXN1bSArPSBpOwoJCQl9CgkJfQoJCW51bGxtZXRob2Qoc3VtKTsKCQlyZXR1cm4gU3lzdGVtLm5hbm9UaW1lKCkgLSBiZWdpbjsKCX0KCQoJc3RhdGljIGxvbmcgdGVzdEF0b21pY0xvbmcoZmluYWwgaW50IG4pIHsKCQlmaW5hbCBsb25nIGJlZ2luID0gU3lzdGVtLm5hbm9UaW1lKCk7CgkJQXRvbWljTG9uZyBzdW0gPSBuZXcgQXRvbWljTG9uZygpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJCXN1bS5hZGRBbmRHZXQoaSk7CgkJfQoJCW51bGxtZXRob2Qoc3VtLmdldCgpKTsKCQlyZXR1cm4gU3lzdGVtLm5hbm9UaW1lKCkgLSBiZWdpbjsKCX0KCQp9Cg==