Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Разработка крупного Standalone проекта на юнити: улучшаем производительностьВадим Воробьев
Презентация к докладу на DevGamm 2015, Минск.
В докладе рассказывлось о технических тонкостях оптимизации под ПК в Unity на примере The Godlike и приводились истории разработки. Как использовать кодогенерацию, что может профайлер Unity, как правильно работать с UI и почему не стоит связываться с LINQ.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Guava - open-source библиотека, разработанная в основном инженерами компании Google, в которой есть множество полезных утилит для написания эффективного и красивого кода. В Guava решено множество типичных задач, которые часто возникают при работе с примитивами, строками, коллекциями, параллельными вычислениями, кэшированием данных и многим другим. В докладе поговорим о возможностях, которые предоставляет Guava, рассмотрим примеры использования утилит библиотеки.
Разработка крупного Standalone проекта на юнити: улучшаем производительностьВадим Воробьев
Презентация к докладу на DevGamm 2015, Минск.
В докладе рассказывлось о технических тонкостях оптимизации под ПК в Unity на примере The Godlike и приводились истории разработки. Как использовать кодогенерацию, что может профайлер Unity, как правильно работать с UI и почему не стоит связываться с LINQ.
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...Mail.ru Group
Существуют три наисложнейшие проблемы в программировании: именование, кэширование и выход за границу массива. Проверка пограничных случаев поведения кода наиболее важна, но эта зона также наименее тестируема. Придумать и предугадать все возможные ситуации человеку тяжело, и порой мы что-то упускаем из виду. Вот было бы здорово, если бы тесты сами находили такие случаи, при которых код падает… Мечты? О том, как превратить их в реальность, и рассказал Александр.
Способы применения JavaScript сильно изменились за последнее время. Но сам язык начал меняться только сейчас. Я расскажу вам, что нового нас ожидает в ECMAScript 6. Вот несколько тезисов:
— новые методы базовых объектов,
— управление областью видимости,
— работа с коллекциями,
— мой любимый «…» префикс,
— генераторы,
— классы.
И, конечно, не забуду рассказать, что из этого можно использовать уже сейчас.
При написании программы, разработчик примерно представляет себе, как должна работать его программа. Но не всегда его ожидания соответствуют действительности — приложения тормозят, потребляют много ресурсов и вообще ведут себя не так, как задумывалось, особенно под большой нагрузкой. В своём докладе я покажу, как заглянуть "под капот" ваших приложений на Python (и Django в частности): какие способы профилирования бывают и когда их можно использовать, расскажу об отладке приложений и различных инструментах, которые помогают разработчику при разработке.
Докладчик:
Владимир Донец (kwimba.ru)
Описание: Слышали про магию в Python? Одно из магических заклинаний называется дескрипторы. Мощная фича языка, которая позволяет определять свое поведение атрибута объекта при доступе к этому атрибуту.
Сложно звучит? А вы знали, что дескрипторами уже наверняка пользовались, если хотя бы раз писали на Python. Я расскажу о том, что такое дескрипторы и как их осознанно можно применять в собственном коде.
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
Доклад для Middle и Senior .NET-программистов о микроптимизациях приложения, из которого Вы узнаете:
О том, как важно понимать IL и ASM код, соответствующий вашей C#-программе;
О различных уровнях микрооптимизаций начиная от C# и JIT компиляторов, заканчивая CPU;
Об особенностях оптимизаций под различные процессорные архитектуры;
Об отличиях разных версиях JIT-компиляторов, включая RyuJIT;
О том, как правильно замерять время выполнения приложений и оценивать эффективность оптимизаций.
Доклад будет полезен всем разработчикам, которые хотят хотят сделать свои и без того быстрые программы ещё на 5-10% быстрее.
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...Mail.ru Group
Существуют три наисложнейшие проблемы в программировании: именование, кэширование и выход за границу массива. Проверка пограничных случаев поведения кода наиболее важна, но эта зона также наименее тестируема. Придумать и предугадать все возможные ситуации человеку тяжело, и порой мы что-то упускаем из виду. Вот было бы здорово, если бы тесты сами находили такие случаи, при которых код падает… Мечты? О том, как превратить их в реальность, и рассказал Александр.
Способы применения JavaScript сильно изменились за последнее время. Но сам язык начал меняться только сейчас. Я расскажу вам, что нового нас ожидает в ECMAScript 6. Вот несколько тезисов:
— новые методы базовых объектов,
— управление областью видимости,
— работа с коллекциями,
— мой любимый «…» префикс,
— генераторы,
— классы.
И, конечно, не забуду рассказать, что из этого можно использовать уже сейчас.
При написании программы, разработчик примерно представляет себе, как должна работать его программа. Но не всегда его ожидания соответствуют действительности — приложения тормозят, потребляют много ресурсов и вообще ведут себя не так, как задумывалось, особенно под большой нагрузкой. В своём докладе я покажу, как заглянуть "под капот" ваших приложений на Python (и Django в частности): какие способы профилирования бывают и когда их можно использовать, расскажу об отладке приложений и различных инструментах, которые помогают разработчику при разработке.
Докладчик:
Владимир Донец (kwimba.ru)
Описание: Слышали про магию в Python? Одно из магических заклинаний называется дескрипторы. Мощная фича языка, которая позволяет определять свое поведение атрибута объекта при доступе к этому атрибуту.
Сложно звучит? А вы знали, что дескрипторами уже наверняка пользовались, если хотя бы раз писали на Python. Я расскажу о том, что такое дескрипторы и как их осознанно можно применять в собственном коде.
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
Доклад для Middle и Senior .NET-программистов о микроптимизациях приложения, из которого Вы узнаете:
О том, как важно понимать IL и ASM код, соответствующий вашей C#-программе;
О различных уровнях микрооптимизаций начиная от C# и JIT компиляторов, заканчивая CPU;
Об особенностях оптимизаций под различные процессорные архитектуры;
Об отличиях разных версиях JIT-компиляторов, включая RyuJIT;
О том, как правильно замерять время выполнения приложений и оценивать эффективность оптимизаций.
Доклад будет полезен всем разработчикам, которые хотят хотят сделать свои и без того быстрые программы ещё на 5-10% быстрее.
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
[Expert Fridays] Dmitry Isaev - Функциональные велосипеды в JavaProvectus
Есть ли в джава функциональщина? Если есть - нужна ли она? Если нужна - как ее лучше приготовить? Скандалы, интриги, расследования. Немного Vavr, стримов и монад на закуску
Рarse'им бэкенд
Аким Халилов
Вы хотите выучить Backbone? Хотите просто писать клиентский код, не думая о сервере и о том, как все обрабатывать, хранить, бэкапить? Выход есть – храните с помощью Parse. Parse – платформа, которая предоставляет возможность хранения данных без забот о сервере. Хранилище данных, соц. сети, push-notification, cloud code. Что такое Parse и что он умеет, о библиотеке для использования:
- знакомство с JS API и примеры использования;
- начинаем кодить: stub-проект;
- кодим фичи: CRUD + плюшки;
- хостим.
* Почему Angular 2 такой быстрый и как его ускорить еще сильнее?
* Как работает Change Detection механизм и как им управлять?
* Зачем нам Zone.js и Функциональное Реактивное Программирование?
* Как работать с Redux и Mobx в Angular 2 и что можно от этого выиграть?
Об этом и ряде других вещей вы узнаете из этого доклада.
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
Расскажу о небольшом исследовании, в котором мы думали о том, можем ли мы себе позволить использовать React для отдельных элементов на сайте, как устроен серверный рендеринг в VK; и получилось ли связать одно с другим. Упомяну о строковых шаблонизаторах, виртуальной DOM и LR-парсерах.
7. 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);
8. 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;
}
25. 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)
26. 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)
29. www.luxoft.com
for (int i = from; i < to; i++) {
E removed = list.remove(from);
use(removed)
}
Если удалённое значение
используется?
30. 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): обратный проход
31. 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
Считаем удаление из середины списка
43. www.luxoft.com
И посмотрим на них в отладчике
Iterator<String> iterator1 = items.stream().map(Object::toString).collect(toList()).iterator();
Iterator<String> iterator2 = items.stream().map(Object::toString).iterator();
45. 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];
}
49. 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;
}
}
64. www.luxoft.com
Что мы сделали?
Завернули
массив в
список
Обрезали
список
Развернули
список в
массив
StackTraceElement[] trace = th.getStackTrace();
StackTraceElement[] newTrace = Arrays
.asList(trace).subList(0, newDepth).toArray(new StackTraceElement[0]);
65. www.luxoft.com
Что нужно было сделать
Arrays.asList(trace).subList(0, newDepth).toArray(new StackTraceElement[0]);
Arrays.copyOf(trace, newDepth);
66. www.luxoft.com
Что нужно было сделать
Arrays.asList(trace).subList(0, newDepth).toArray(new StackTraceElement[0]);
Arrays.copyOf(trace, newDepth); // простая запись, отсчёт с 0
или
Arrays.copyOfRange(trace, 0, newDepth)); // формальная запись, явно указан
0
80. www.luxoft.com
List<T> list = new ArrayList<>();
for (Byte item : items)
list.add(item);
Выводы: аргументация
List<T> list = new ArrayList<>(items);
81. 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);
82. 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);
83. 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);
84. 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)
В сухом остатке