SlideShare une entreprise Scribd logo
1  sur  85
Télécharger pour lire hors ligne
www.luxoft.com
ПРОИЗВОДИТЕЛЬНОСТЬ:
1001 МЕЛОЧЬ
www.luxoft.com
Пара слов обо мне
• работаю в «Люксофте»
• пишу на Java
• люблю разбираться с проблемами
производительности
www.luxoft.com
Что измеряли?
Исходный код: https://github.com/stsypanov/logeek-night-benchmark.git
Java 8: ветка master
Java 9: ветка master-java-9
www.luxoft.com
Разминка
T[] items = data.array;
Collection<T> coll = new HashSet<>();
www.luxoft.com
Разминка
T[] items = data.array;
Collection<T> coll = new HashSet<>();
coll.addAll(asList(items));
www.luxoft.com
java.util.AbstractCollection
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
www.luxoft.com
После вычитки
T[] items = data.array;
Collection<T> coll = new HashSet<>();
coll.addAll(asList(items));
T[] items = data.array;
Collection<T> coll = new HashSet<>();
Collections.addAll(coll, items);
www.luxoft.com
Ведь написано же
/**
* Adds all of the specified elements to the specified collection.
* Elements to be added may be specified individually or as an array.
* The behavior of this convenience method is identical to that of
* <tt>c.addAll(Arrays.asList(elements))</tt>, but this method is likely
* to run significantly faster under most implementations.
*/
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
www.luxoft.com
CollectionsAddAllVsAddAllBenchmark
@Benchmark
public boolean collectionsAddAll(Data data) {
Collection<Integer> collection = data.freshCollection();
Integer[] array = data.array;
return Collections.addAll(collection, array);
}
@Benchmark
public boolean addAll(Data data) {
Collection<Integer> collection = data.freshCollection();
List<Integer> arrayAsList = Arrays.asList(data.array);
return collection.addAll(arrayAsList);
}
www.luxoft.com
HashSet, нс/операцию
size Java 8
addAll 10 227,8 ± 6,2
collectionsAddAll 10 208,2 ± 3
addAll 100 2798,2 ± 61,7
collectionsAddAll 100 2150,4 ± 29,3
addAll 1000 26212,2 ± 410
collectionsAddAll 1000 20960,9 ± 396,5
www.luxoft.com
HashSet, нс/проход
size Java 8 Java 9
addAll 10 227,8 ± 6,2 170,4 ± 2,7
collectionsAddAll 10 208,2 ± 3 170,8 ± 2,7
addAll 100 2798,2 ± 61,7 2170,6 ± 29,9
collectionsAddAll 100 2150,4 ± 29,3 2179,3 ± 36,9
addAll 1000 26212,2 ± 410 20008,5 ± 310,9
collectionsAddAll 1000 20960,9 ± 396,5 19986,4 ± 274,4
www.luxoft.com
ArrayList, нс/проход
size Java 8 Java 9
addAll 10 57,9 ± 1,0 40,0 ± 0,8
collectionsAddAll 10 77,0 ± 1,1 53,4 ± 0,8
addAll 100 231,3 ± 4,4 220,8 ± 5,4
collectionsAddAll 100 723,0 ± 12,8 641,3 ± 8,2
addAll 1000 1883,0 ± 57,5 1708,3 ± 18,7
collectionsAddAll 1000 7371,5 ± 85,4 8033,2 ± 279,4
www.luxoft.com
ArrayList.addAll
@Override
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
www.luxoft.com
CopyOnWriteArrayList, нс/проход
size Java 8 Java 9
addAll 10 80,1 ± 1,0 32,9 ± 0,4
collectionsAddAll 10 516,5 ± 16,2 192,7 ± 2,5
addAll 100 259,6 ± 3,3 111,3 ± 1,1
collectionsAddAll 100 7559,0 ± 109,2 5509,7 ± 59,3
addAll 1000 1958,4 ± 43,1 1008,7 ± 10,4
collectionsAddAll 1000 606132,5 ± 11235,1 505670,8 ± 5603,9
www.luxoft.com
СОВЕТ РАЗРАБОТЧИКУ
Нельзя слепо доверять
документации, даже очень простой
код может таить подводные камни.
www.luxoft.com
Повторение пройденного
for (Long id : ids) {
SomeEntity entity = repository.findOne(id);
use(entity);
}
www.luxoft.com
Повторение пройденного
List<SomeEntity> entities = repository.findAll(ids);
for (SomeEntity entity : entities) {
use(entity);
}
for (Long id : ids) {
SomeEntity entity = repository.findOne(id);
use(entity);
}
www.luxoft.com
И если раньше было так
www.luxoft.com
То теперь стало так
www.luxoft.com
Или даже так
www.luxoft.com
Считаем (ArrayList, нс)
size = 1000
992,8
225,9 115,1
11372,8
1915,8
1080,9745,5
201,8 100,6
9544,7
1636,5
968,1
0
2000
4000
6000
8000
10000
12000
1 by 1 addAll constr 1 by 1 addAll constr
Java 8
Java 9
size = 100
www.luxoft.com
Считаем (HashSet, нс)
size = 100 size = 1000
1629,2 1812,3 1266,4
15462,7 15540,1
12126,7
1731,5 1801,7 1296,8
15762,4 15958,6
12275,1
0
2000
4000
6000
8000
10000
12000
14000
16000
18000
1 by 1 addAll constr 1 by 1 addAll constr
Java 8
Java 9
www.luxoft.com
Почти одинаковый код
List<T> list = new ArrayList<>(collection);
List<T> list = new ArrayList<>();
list.addAll(collection);
www.luxoft.com
ArrayList.remove(index)
for (int i = from; i < to; i++) {
list.remove(from);
}
www.luxoft.com
public E remove(int index) {
Objects.checkIndex(index, size);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
ArrayList.remove(index)
www.luxoft.com
public E remove(int index) {
Objects.checkIndex(index, size);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
ArrayList.remove(index)
www.luxoft.com
ArrayList.subList().clear()
for (int i = from; i < to; i++) {
list.remove(from);
}
list.subList(from, to).clear();
www.luxoft.com
ArrayList.subList().clear()
public void clear() {
removeRange(0, size());
}
void removeRange(int from, int to) {
checkForComodification();
parent.removeRange(parentOffset + from, parentOffset + to);
this.modCount = parent.modCount;
this.size -= toIndex - fromIndex;
}
www.luxoft.com
for (int i = from; i < to; i++) {
E removed = list.remove(from);
use(removed)
}
Если удалённое значение
используется?
www.luxoft.com
//обратный проход
for (int i = to - 1; i >= from; i--) {
E removed = list.remove(i);
use(removed)
}
//прямой проход
for (int i = from; i < to; i++) {
E removed = list.remove(from);
use(removed)
}
ArrayList.remove(i): обратный проход
www.luxoft.com
for (int i = from; i < to; i++) // прямой проход
list.remove(from);
for (int i = to - 1; i >= from; i--) // обратный проход
list.remove(i);
list.subList(from, to).clear(); // subList
Считаем удаление из середины списка
www.luxoft.com
Java 8, время выполнения (нс), size = 100
208,2 202,6
119,6
412,2
364
117,4
709,8
136,5 117,4
0
100
200
300
400
500
600
700
10 ПП 10 ОП 10 sL 25 ПП 25 ОП 25 sL 50 ПП 50 ОП 50 sL
ПП – прямой порядок, ОП – обратный порядок, sL – subList
www.luxoft.com
Java 9, время выполнения (нс), size = 100
ПП – прямой порядок, ОП – обратный порядок, sL – subList
187,8 177,7
106,7
379,6
345,2
106,7
637,8
127,7 107,2
0
100
200
300
400
500
600
700
10 ПП 10 ОП 10 sL 25 ПП 25 ОП 25 sL 50 ПП 50 ОП 50 sL
www.luxoft.com
public E remove(int i) {
Objects.checkIndex(i, size);
modCount++;
E oldValue = elementData(i);
int numMoved = size - i - 1;
if (numMoved > 0)
System.arraycopy(array, i+1, array, i, numMoved);
elementData[--size] = null;
return oldValue;
}
637,8
127,7 107,2
0
100
200
300
400
500
600
700
50 ПП 50 ОП 50 sL
Всегда удаляем последнюю ячейку
www.luxoft.com
СОВЕТ РАЗРАБОТЧИКУ
«Грузите апельсины бочках» (с).
Как правило, массовые действия:
- быстрее
- требуют меньше памяти
- неделимы
www.luxoft.com
Ещё пример
Iterator<String> iterator = items.stream()
.map(Object::toString)
.collect(toList())
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
www.luxoft.com
Iterator<String> iterator = items.stream()
.map(Object::toString)
.collect(toList())
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
Избыточность
www.luxoft.com
Убираем избыточность
Iterator<String> iterator = items.stream()
.map(Object::toString)
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
Iterator<String> iterator = items.stream()
.map(Object::toString)
.collect(toList())
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
www.luxoft.com
Считаем (время выполнения, нс)
Iterator<String> iterator = items.stream()
.map(Object::toString)
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
Iterator<String> iterator = items.stream()
.map(Object::toString)
.collect(toList())
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
(size) Score Error Score Error Units
10 628,2 ± 11,5 802,8 ± 9,6 ns/op
100 5570,1 ± 36,0 7121,4 ± 131,6 ns/op
1000 62056,4 ± 2977,8 76045,7 ± 1458,1 ns/op
www.luxoft.com
(size) Score Error Score Error Units
10 628,2 ± 11,5 802,8 ± 9,6 ns/op
100 5570,1 ± 36,0 7121,4 ± 131,6 ns/op
1000 62056,4 ± 2977,8 76045,7 ± 1458,1 ns/op
Это как?
Iterator<String> iterator = items.stream()
.map(Object::toString)
.iterator();
Iterator<String> iterator = items.stream()
.map(Object::toString)
.collect(toList())
.iterator();
www.luxoft.com
Сравним с Java 9, нс/оп
Iterator<String> iterator =
items
.stream()
.map(Object::toString)
.collect(toList())
.iterator();
Iterator<String> iterator =
items
.stream()
.map(Object::toString)
.iterator();
(size) Score Score Diff
Java 8
10 628,2 802,8 + 21,75 %
100 5570,1 7121,4 + 21,78 %
1000 62056,4 76045,7 + 18,40 %
Java 9
10 485,2 599,2 + 19,03 %
100 3993,7 5220,3 + 23,50 %
1000 43252,5 49409,6 + 12,46 %
www.luxoft.com
Возьмём два итератора
Iterator<String> iterator1 = items.stream().map(Object::toString).collect(toList()).iterator();
Iterator<String> iterator2 = items.stream().map(Object::toString).iterator();
www.luxoft.com
И посмотрим на них в отладчике
Iterator<String> iterator1 = items.stream().map(Object::toString).collect(toList()).iterator();
Iterator<String> iterator2 = items.stream().map(Object::toString).iterator();
www.luxoft.com
Итератор 1 – это java.util.ArrayList.Itr
данные
www.luxoft.com
Проход по нему тоже несложный
public boolean hasNext() {
return cursor != size;
}
public E next() {
checkForComodification();
int i = cursor;
if (i >= size) throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
www.luxoft.com
Проход по нему тоже несложный
www.luxoft.com
Итератор 2 интереснее
www.luxoft.com
В его основе ArrayListSpliterator
данные
www.luxoft.com
Проход по нему сложнее
public boolean hasNext() {
if (!valueReady)
spliterator.tryAdvance(this);
return valueReady;
}
public T next() {
if (!valueReady && !hasNext())
throw new NoSuchElementException();
else {
valueReady = false;
return nextElement;
}
}
www.luxoft.com
Проход по нему сложнее
www.luxoft.com
Проход по нему сложнее и дороже
www.luxoft.com
items
.stream()
.map(Object::toString)
.forEach(bh::consume);
Попробуем без итератора
Iterator itr = items
.stream()
.map(Object::toString)
.collect(toList())
.iterator();
while (itr.hasNext())
bh.consume(itr.next());
Iterator itr = items
.stream()
.map(Object::toString)
.iterator();
while (itr.hasNext())
bh.consume(itr.next());
www.luxoft.com
Попробуем без итератора
Iterator iterator = items
.stream()
.map(Object::toString)
.collect(toList())
.iterator();
Iterator iterator = items
.stream()
.map(Object::toString)
.iterator();
items
.stream()
.map(Object::toString)
.forEach(bh::consume);
Java 8 Java 9
size Score Score Units
10 628,2 485,2 ns/op
100 5570,1 3993,7 ns/op
1000 62056,4 43252,5 ns/op
10 802,8 599,2 ns/op
100 7121,4 5220,3 ns/op
1000 76045,7 49409,6 ns/op
10 539,6 416,4 ns/op
100 5009,9 3761,8 ns/op
1000 52946,0 34939,0 ns/op
www.luxoft.com
Почему стало быстрее?
Вроде быстрее быть не должно, т. к. в основе тот же ArrayListSpliterator.
www.luxoft.com
Вроде быстрее быть не должно, т. к. в основе тот же ArrayListSpliterator.
Но есть отличие:
Почему стало быстрее?
www.luxoft.com
void forEachRemaining(Consumer<? super E> action) {
// …
Object[] a = lst.elementData;
if ((i = index) >= 0 && (index = hi) <= a.length) {
for (; i < hi; ++i) {
E e = (E) a[i];
action.accept(e);
}
if (modCount == mc) return;
}
// …
}
ArrayListSpliterator.forEachRemaining
www.luxoft.com
void forEachRemaining(Consumer<? super E> action) {
// …
Object[] a = lst.elementData;
if ((i = index) >= 0 && (index = hi) <= a.length) {
for (; i < hi; ++i) {
E e = (E) a[i];
action.accept(e);
}
if (modCount == mc) return;
}
// …
}
Почему стало быстрее?
www.luxoft.com
Почему стало быстрее?
www.luxoft.com
СОВЕТ РАЗРАБОТЧИКУ
Проверяй.
Проверяй.
Проверяй.
www.luxoft.com
Код из IntelliJ IDEA: 2 подвоха
StackTraceElement[] trace = th.getStackTrace();
StackTraceElement[] newTrace = Arrays
.asList(trace)
.subList(0, newDepth)
.toArray(new StackTraceElement[newDepth]);
www.luxoft.com
Подвох 1
Arrays of Wisdom of the Ancients
https://shipilev.net/blog/2016/arrays-wisdom-ancients/
StackTraceElement[] trace = th.getStackTrace();
StackTraceElement[] newTrace = Arrays
.asList(trace)
.subList(0, newDepth)
.toArray(new StackTraceElement[newDepth]);
www.luxoft.com
Подвох 2
StackTraceElement[] trace = th.getStackTrace();
StackTraceElement[] newTrace = Arrays
.asList(trace)
.subList(0, newDepth)
.toArray(new StackTraceElement[0]);
www.luxoft.com
StackTraceElement[] trace = th.getStackTrace();
StackTraceElement[] newTrace = Arrays
.asList(trace)
.subList(0, newDepth)
.toArray(new StackTraceElement[0]);
Подвох 2
избыточность
www.luxoft.com
Что мы сделали?
Завернули
массив в
список
Обрезали
список
Развернули
список в
массив
StackTraceElement[] trace = th.getStackTrace();
StackTraceElement[] newTrace = Arrays
.asList(trace).subList(0, newDepth).toArray(new StackTraceElement[0]);
www.luxoft.com
Что нужно было сделать
Arrays.asList(trace).subList(0, newDepth).toArray(new StackTraceElement[0]);
Arrays.copyOf(trace, newDepth);
www.luxoft.com
Что нужно было сделать
Arrays.asList(trace).subList(0, newDepth).toArray(new StackTraceElement[0]);
Arrays.copyOf(trace, newDepth); // простая запись, отсчёт с 0
или
Arrays.copyOfRange(trace, 0, newDepth)); // формальная запись, явно указан
0
www.luxoft.com
Считаем (время выполнения, нс)
37,9
46,7
125,8
45,1
53,7
156,5
7,7 8,4
41,8
11,5 13,3
56,6
0
20
40
60
80
100
120
140
160
180
5 10 100 5 10 100
subList
copyOf
JAVA 8 JAVA 9
www.luxoft.com
Что мы проверяем?
return collection.stream().allMatch(anotherCollection::contains);
www.luxoft.com
return collection.stream().allMatch(anotherCollection::contains);
return anotherCollection.containsAll(collection);
Стримоз головного мозга detected!
www.luxoft.com
Считаем (HashSet, время выполнения)
119,2
827,4
7154,9
125,2
878,1
6682,8
62,5
575,6
5062,5
72,5
673,3
6303
0
1000
2000
3000
4000
5000
6000
7000
8000
10 100 1000 10 100 1000
allMatch
containsAll
JAVA 8 JAVA 9
www.luxoft.com
Считаем (HashSet, память)
Java 8 Java 9
streamAllMatch:·gc.alloc.rate.norm 1 160 184 B/op
containsAll:·gc.alloc.rate.norm 1 ≈ 0 ≈ 0 B/op
streamAllMatch:·gc.alloc.rate.norm 10 160 184
B/op
containsAll:·gc.alloc.rate.norm 10 ≈ 0 ≈ 0 B/op
streamAllMatch:·gc.alloc.rate.norm 100 160 184
B/op
containsAll:·gc.alloc.rate.norm 100 ≈ 0 ≈ 0 B/op
streamAllMatch:·gc.alloc.rate.norm 1000 160 184
B/op
containsAll:·gc.alloc.rate.norm 1000 32 ≈ 0 B/op
www.luxoft.com
115,7 1880,9
116833,8
104,1 1674,7
110689,5
53 1650,1
107726,9
52,4 1452,1
100625,2
0
20000
40000
60000
80000
100000
120000
10 100 1000 10 100 1000
allMatch
Считаем (ArrayList, время
выполнения)
JAVA 8 JAVA 9
www.luxoft.com
Считаем (ArrayList, память)
Java 8 Java 9
streamAllMatch:·gc.alloc.rate.norm 1 160 184 B/op
containsAll:·gc.alloc.rate.norm 1 ≈ 0 ≈ 0 B/op
streamAllMatch:·gc.alloc.rate.norm 10
160 184 B/op
containsAll:·gc.alloc.rate.norm 10 ≈ 0 ≈ 0 B/op
streamAllMatch:·gc.alloc.rate.norm 100
160 184 B/op
containsAll:·gc.alloc.rate.norm 100 ≈ 0 ≈ 0 B/op
streamAllMatch:·gc.alloc.rate.norm 1000
162 175 B/op
containsAll:·gc.alloc.rate.norm 1000 17 40 B/op
www.luxoft.com
Функционал
interface Fetcher {
String[] fetch();
}
www.luxoft.com
И его использование
interface Fetcher {
String[] fetch();
}
private Fetcher fetcher;
void fetchAndWrite() {
for (String str : asList(fetcher.fetch())) {
write(str);
}
}
www.luxoft.com
interface Fetcher {
String[] fetch();
}
private Fetcher fetcher;
void fetchAndWrite() {
for (String str : asList(fetcher.fetch())) {
write(str);
}
}
Избыточность
www.luxoft.com
Правильное использование
interface Fetcher {
String[] fetch();
}
private Fetcher fetcher;
void fetchAndWrite() {
for (String str : fetcher.fetch()) {
write(str);
}
}
www.luxoft.com
Считаем (время выполнения, нс)
5,6 19,9 38,3
375,9
3338,6
5,7 18,7 34,5
330,8
3200,4
9,3 29,5 53,9
530,8
5193,8
5,5 26,3 52,1
526,2
5177,4
0
1000
2000
3000
4000
5000
1 5 10 100 1000 1 5 10 100 1000
array
asList
JAVA 8 JAVA 9
www.luxoft.com
Более производительный код как правило:
- более краткий
- более атомарный
- более надёжный
- более простой для понимания
Выводы
www.luxoft.com
List<T> list = new ArrayList<>();
for (Byte item : items)
list.add(item);
Выводы: аргументация
List<T> list = new ArrayList<>(items);
www.luxoft.com
List<T> list = new ArrayList<>();
for (Byte item : items)
list.add(item);
Iterator<T> iterator = list.stream()
.map(Object::toString)
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
Выводы: аргументация
List<T> list = new ArrayList<>(items);
Iterator<T> iterator = list.stream()
.map(Object::toString)
.forEach(bh::consume);
www.luxoft.com
List<T> list = new ArrayList<>();
for (Byte item : items)
list.add(item);
Iterator<T> iterator = list.stream()
.map(Object::toString)
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
list.stream().allMatch(collection::contains);
Выводы: аргументация
List<T> list = new ArrayList<>(items);
Iterator<T> iterator = list.stream()
.map(Object::toString)
.forEach(bh::consume);
collection.containsAll(list);
www.luxoft.com
List<T> list = new ArrayList<>();
for (Byte item : items)
list.add(item);
Iterator<T> iterator = list.stream()
.map(Object::toString)
.iterator();
while (iterator.hasNext())
bh.consume(iterator.next());
list.stream().allMatch(collection::contains);
Arrays.asList(array)
.subList(0, size)
.toArray(new String[0]);
Выводы: аргументация
List<T> list = new ArrayList<>(items);
Iterator<T> iterator = list.stream()
.map(Object::toString)
.forEach(bh::consume);
collection.containsAll(list);
Arrays.copyOf(array, size);
www.luxoft.com
IDEA-138456 Performance inspection: 'Collection.addAll() can be replaced with
parametrised constructor‘ (142.1217)
IDEA-165942 Inspection to replace method call in a loop with bulk operation (2017.1)
IDEA-178761 'Collection.addAll() can be replaced with parametrized constructor'
should be active by default (2017.3)
IDEA-182206 Simplification for Arrays.asList().sublist().toArray() (2018.1)
IDEA-181928 Stream.allMatch(Collection::contains) can be simplified to
Collection.containsAll() (2018.1)
IDEA-184240 Unnecessary array-to-collection wrapping should be detected (2018.1)
В сухом остатке
www.luxoft.com
БЛАГОДАРЮ ЗА ВНИМАНИЕ

Contenu connexe

Tendances

Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмRuslan Balkin
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвЮрий Сыровецкий
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETAndrey Akinshin
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...Mail.ru Group
 
ECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScriptECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScriptAlexey Simonenko
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)it-park
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?PyNSK
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03Computer Science Club
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателейDEVTYPE
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAYury Novozhilov
 

Tendances (20)

Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
 
Монады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон ХоломьёвМонады для барабанщиков. Антон Холомьёв
Монады для барабанщиков. Антон Холомьёв
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
 
ECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScriptECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScript
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
 
Scala on android
Scala on androidScala on android
Scala on android
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
User Defined Materials in LS-DYNA
User Defined Materials in LS-DYNAUser Defined Materials in LS-DYNA
User Defined Materials in LS-DYNA
 

Similaire à Sergii Tsypanov "Performance 1001 Tips"

[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)Anton Bukov
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...CocoaHeads
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в JavaProvectus
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlOleksandr Petrov
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Dmitry Tsitelov
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Dmitry Stropalov
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
 

Similaire à Sergii Tsypanov "Performance 1001 Tips" (20)

[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в Java
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher Sql
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)Multiprocessor Programming Intro (lecture 3)
Multiprocessor Programming Intro (lecture 3)
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Scala for android
Scala for androidScala for android
Scala for android
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)Scala and LiftWeb presentation (Russian)
Scala and LiftWeb presentation (Russian)
 
automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендеринг
 
лекция 3
лекция 3лекция 3
лекция 3
 

Plus de LogeekNightUkraine

Autonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, futureAutonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, futureLogeekNightUkraine
 
Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design" Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design" LogeekNightUkraine
 
Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data" Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data" LogeekNightUkraine
 
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"LogeekNightUkraine
 
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"LogeekNightUkraine
 
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...LogeekNightUkraine
 
Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"LogeekNightUkraine
 
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"LogeekNightUkraine
 
Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"LogeekNightUkraine
 
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...LogeekNightUkraine
 
Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"LogeekNightUkraine
 
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"LogeekNightUkraine
 
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"LogeekNightUkraine
 
Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"LogeekNightUkraine
 
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"LogeekNightUkraine
 
Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"LogeekNightUkraine
 
Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”LogeekNightUkraine
 
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”LogeekNightUkraine
 

Plus de LogeekNightUkraine (20)

Face recognition with c++
Face recognition with c++ Face recognition with c++
Face recognition with c++
 
C++20 features
C++20 features C++20 features
C++20 features
 
Autonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, futureAutonomous driving on your developer pc. technologies, approaches, future
Autonomous driving on your developer pc. technologies, approaches, future
 
Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design" Orkhan Gasimov "High Performance System Design"
Orkhan Gasimov "High Performance System Design"
 
Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data" Vitalii Korzh "Managed Workflows or How to Master Data"
Vitalii Korzh "Managed Workflows or How to Master Data"
 
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"Yevhen Tatarynov "From POC to High-Performance .NET applications"
Yevhen Tatarynov "From POC to High-Performance .NET applications"
 
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
 
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
 
Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"Pavlo Zhdanov "Mastering solid and base principles for software design"
Pavlo Zhdanov "Mastering solid and base principles for software design"
 
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
 
Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"Iurii Antykhovych "Java and performance tools and toys"
Iurii Antykhovych "Java and performance tools and toys"
 
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
 
Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"Aleksandr Kutsan "Managing Dependencies in C++"
Aleksandr Kutsan "Managing Dependencies in C++"
 
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
 
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"Alexandr Golyak, Nikolay Chertkov  "Automotive Testing vs Test Automatio"
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
 
Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"Michal Kordas "Docker: Good, Bad or Both"
Michal Kordas "Docker: Good, Bad or Both"
 
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
 
Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"Shestakov Illia "The Sandbox Theory"
Shestakov Illia "The Sandbox Theory"
 
Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”Dmytro Kochergin “Autotest with CYPRESS”
Dmytro Kochergin “Autotest with CYPRESS”
 
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
 

Dernier (9)

Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 

Sergii Tsypanov "Performance 1001 Tips"