ЧУДЕСА ПРОИЗВОДИТЕЛЬНОСТИ
МАРАТ АХИН
2016
ПРЕЛЮДИЯ
WAT?
Набор удивительных (на первый взгляд) фактов
о производительности ПО
ЧТО ТАКОЕ
ПРОИЗВОДИТЕЛЬНОСТЬ?
Пропускная способность
Время отклика
Разве есть разница?
ЧТО ТАКОЕ
ПРОИЗВОДИТЕЛЬНОСТЬ?
Пропускная способность
Сколько запросов мы можем обработать в
секунду
Время отклика
За сколько секунд мы можем обработать
запрос
“Бабе цветы, дитям мороженое.
Смотри не перепутай!”
ARRAYLIST VS LINKEDLIST
SHOWDOWN
КТО БЫСТРЕЕ?
Вставка в начало
Вставка в середину
Вставка в конец
КТО БЫСТРЕЕ?
Вставка в начало
LinkedList
Вставка в середину
LinkedList
Вставка в конец
ArrayList / LinkedList
СЕМЬ РАЗ ПОМЕРЬ, А ПОТОМ
ПОМЕРЬ ВОСЬМОЙ
Единственная истина в оценке
производительности — результат
эксперимента…
…за исключением
случаев, когда
эксперимент врет
JMH
JAVA HARNESS FOR
MICROBENCHMARKS
Разрабатывается Алексеем Шипилевым
Постоянно обновляется
Учитывает “подкапотные” особенности JVM
Dead code elimination
CPU burning
JIT
JAVA HARNESS FOR
MICROBENCHMARKS
WAT?
Вставка в начало
LinkedList
Вставка в середину
ArrayList
Вставка в конец
ArrayList
CPU CACHES
LATENCY NUMBERS
What Time,
ns
Time,
ms
Comment
L1 cache 0.5 ns
Branch
mispredict
5 ns
L2 cache 7 ns 14x L1
cache
Mutex
lock/unlock
25 ns
LATENCY NUMBERS
What Time,
ns
Time,
ms
Comment
Main memory 100 ns 20x L2 cache,
200x L1
cache
Compress 1 KB
with Zippy
3,000
ns
Send 1 KB over 1
Gbps network
10,000
ns
0.01
ms
LATENCY NUMBERS
What Time, ns Time,
ms
Comment
Read 4 KB
randomly (SSD)
150,000
ns
0.15
ms
Read 1 MB
sequentially
(memory)
250,000
ns
0.25
ms
Round trip within
same datacenter
500,000
ns
0.5
ms
Read 1 MB
sequentially
1,000,000
ns
1 ms 4X
memory
(SSD)
LATENCY NUMBERS
What Time, ns Time,
ms
Comment
Disk seek 10,000,000
ns
10 ms 20x
datacenter
roundtrip
Read 1 MB
sequentially
(disk)
20,000,000
ns
20 ms 80x
memory,
20X SSD
Send packet
SFO-AMS-SFO
150,000,000
ns
150
ms
HARDWARE MATTERS
Каждый кэш-промах вызывает задержку
работы программы (20x+ раз)
Хочется использовать кэш по максимуму
Оптимизировать под кэш?
ONE SIZE FITS THEM ALL!
У разных процессоров разные параметры кэша
Оптимизировать под конкретный процессор?
Cache-oblivious algorithms
КОММЕНТАРИИ ЗАМЕДЛЯЮТ
ВАШ КОД
WAT?
ENTER JAVASCRIPT
function add(x, y) {
  /* A very important comment explaining how add works.
     **************************************************
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     An Ascii­art from Wikipedia:
       |_/|        ****************************
      / @ @        *  "Purrrfectly pleasant"  *
     ( > º < )      *       Poppy Prinz        *
      `»»x««´       *       (pprinz@...)       *
      /  O  
     ­­­­­­­­­­­­­
     **************************************************
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   */
  return x + y;
}
...
ENTER JAVASCRIPT
function add(x, y) {
  // This function adds stuff.
  return x + y;
}
...
TL;DR
JIT
JUST-IN-TIME КОМПИЛЯЦИЯ
Интерпретируемые языки иногда
компилируются в машинный код
Компилятор решает, когда и как это
происходит
INLINING
Короткие функции часто выгоднее встроить
прямо в места вызова
Что такое короткая функция?
В JS размер функции учитывает
комментарии
WAT?
Производительность зависит не
только от программы, но и от
компилятора…
…и от интерпретатора
THAT’S ALL FOLKS!
THAT’S ALL FOLKS!
WAT?

Чудеса производительности