После посещения javaday 2015 Kharkiv возникла мысль померить скорость работы разных иплементаций потокобезопасного счетчика. Участники забега:
- AtomicLong jre7
- AtomicLong jre8
- Synchronized
- RentrantLock nonFair
- LongAdder
Код бенчмарка можно посмотреть на гитхабе.
Тестирование проводилось на четырехъядерном Intel(R) Core(TM)2 Quad CPU Q6600 2.40GHz
Получившиеся результаты:
1. Непонятно ведет себя ReentrantLock. При двух потоках его результат такой же как и при 16.
2. При увеличении кол-ва потоков практически нет разницы между synchronized и AtomicLong в JRE8.
3. AtomicLong в JRE8 был значительно оптимизирован.
4. LongAdder - узкоспециализированный идеально справляющийся с этой задачей.
За счет чего был оптимизирован AtomicLong?
Включим вывод дизассемблированого кода. Для этого:
1. Нужно установить openjdk-hsdis модуль. Это можно сделать или из репозитория или собрать вручную и положить модуль по адресу ${JDK_HOME}/jre/lib/amd64/hsdis-amd64.so
2. -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*AtomicLong.incrementAndGet -XX:PrintAssemblyOptions=intel
Результат для java7:
0x00007f085d0651d6: mov r10,QWORD PTR [rsi+0x10] ;*invokevirtual compareAndSwapLong ; - java.util.concurrent.atomic.AtomicLong::compareAndSet@9 (line 149) ; - java.util.concurrent.atomic.AtomicLong::incrementAndGet@12 (line 220) 0x00007f085d0651da: mov r8,r10 0x00007f085d0651dd: add r8,0x1 ;*ladd ; - java.util.concurrent.atomic.AtomicLong::incrementAndGet@7 (line 219) 0x00007f085d0651e1: mov rax,r10 0x00007f085d0651e4: lock cmpxchg QWORD PTR [rsi+0x10],r8 0x00007f085d0651ea: sete r11b 0x00007f085d0651ee: movzx r11d,r11b ;*invokevirtual compareAndSwapLong ; - java.util.concurrent.atomic.AtomicLong::compareAndSet@9 (line 149) ; - java.util.concurrent.atomic.AtomicLong::incrementAndGet@12 (line 220) 0x00007f085d0651f2: test r11d,r11d 0x00007f085d0651f5: je 0x00007f085d0651d0 ;*ifeq ; - java.util.concurrent.atomic.AtomicLong::incrementAndGet@15 (line 220) 0x00007f085d0651f7: jmp 0x00007f085d0651ba
Для java8 все несколько проще:
0x00007ff8b111ab3e: movabs rax,0x1 0x00007ff8b111ab48: mov rdi,rax 0x00007ff8b111ab4b: lock xadd QWORD PTR [rsi+0x10],rdi 0x00007ff8b111ab51: add rdi,rax 0x00007ff8b111ab54: mov rax,rdi
Комментариев нет:
Отправить комментарий