ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ЛЕКЦИЯ 8. Многопоточное программирование без использования блокировок. Модель потребитель-производитель. Потокобезопасный стек. Проблема ABA. Указатели опасности.
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 1. Актуальность параллельных вычислений. Анализ параллельных алгоритмов. Многоядерные вычислительные систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
ЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
ЛЕКЦИЯ 1. Введение в параллельные вычисления
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ЛЕКЦИЯ 8. Многопоточное программирование без использования блокировок. Модель потребитель-производитель. Потокобезопасный стек. Проблема ABA. Указатели опасности.
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
ЛЕКЦИЯ 6. Разработка параллельных структур данных на основе блокировок
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 1. Актуальность параллельных вычислений. Анализ параллельных алгоритмов. Многоядерные вычислительные систем с общей памятью
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
ЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
ЛЕКЦИЯ 1. Введение в параллельные вычисления
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...corehard_by
- Организация программной системы как совокупности модулей, интерфейсов и управляющих систем.
- Многопоточность - предпосылки для использования и объективная необходимость.
- Организация многопоточности при проектировании алгоритмов, основанных на событиях.
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Презентация посвящена вопросам использования параллельных алгоритмов для создания современных эффективных программных решений. Актуальность данной тематики обусловлена снижением темпов роста тактовой частоты микропроцессоров и возрастанием внимания к использованию всех возможностей многоядерных и многопроцессорных систем. В работе рассмотрен ряд базовых параллельных алгоритмов, таких как умножение матриц, параллельная сортировка Бэтчера, метод Гаусса решения систем линейных алгебраических уравнений и так далее. Приведена реализация этих алгоритмов c использованием языка программирования Си++.
Где кончается react native? / Павел Кондратенко (Rambler&Co)Ontico
РИТ++ 2017, Frontend Сonf
Зал Мумбаи, 5 июня, 11:00
Тезисы:
http://frontendconf.ru/2017/abstracts/2496.html
В своем выступлении я расскажу про то, как библиотека бумажных книг в нашей компании переехала в онлайн и причем тут react native. Погружаясь в архитектуру этой технологии я постараюсь дать представление о том, что можно выжать из нее и где заканчиваются ее возможности. Разберем потоки в приложении, возможные проблемы и все это на таких простых примерах как ActivityIndicator.
Если у вас еще не дошли руки до react native, но всегда хотели разобраться - приходите обязательно! Из моего доклада вы сможете, как минимум, получить представление об этой технологии.
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Alexander Borzunov
Описание декоратора для автоматической оптимизации алгоритмов с помощью быстрого возведения матриц в степень в Python.
Смотрите подробнее:
GitHub: https://github.com/borzunov/cpmoptimize
Хабрахабр: http://habrahabr.ru/post/236689/
Python Package Index: https://pypi.python.org/pypi/cpmoptimize
Доклад о подходе к отслеживанию потоков данных, формирующих окружение, в котором пользователь решает свои задачи. На примере реализации для конкретного фреймворка будет озвучена идея, как уследить за изменением данных на странице.
Подробнее:
Человеческий мозг устроен сложно. Если с ним что-то не так, то для диагностики используют магнитно-резонансный томограф.
Большие одностраничные приложения тоже устроены сложно. Чтобы их починить или обвесить новым функционалом, требуется вникнуть в их устройство. Для этого нередко приходится засучивать рукава и с головой погружаться в самую глубь проекта. И немалая часть проблем связана именно с бизнес-логикой и потоками данных. Но что, если у нас будет возможность проникнуть в структуру данных, способ увидеть связи между ними и отслеживать то, как они влияют друг на друга? Такой способ, чтобы не требовалось вскрытия черепной коробки — все как с МРТ.
В докладе речь пойдет о собственных разработках в этой области.
Доклад о подходе к отслеживанию потоков данных, формирующих окружение, в котором пользователь решает свои задачи.
На примере реализации для конкретного фреймворка будет озвучена идея, как сделать инструмент для отслеживания изменений данных на странице приложения для вашего технологического стека.
Целевая аудитория
Разработчики крупных web-приложений, регулярно сталкивающиеся с проблемой, как уследить за изменением большого количества данных, формирующих интерфейс пользователя, решающих задачу эффективно разобраться с потоками данных для устранения неполадок приложения.
Человеческий организм устроен сложно. Если с ним что-то не так, то для диагностики используют магнитно-резонансный томограф.
Большие одностраничные приложения тоже устроены сложно. Чтобы их починить или обвесить новым функционалом, требуется вникнуть в их устройство. Для этого нередко приходится засучивать рукава и с головой погружаться в самую глубь проекта. И немалая часть проблем связана именно с бизнес логикой и потоками данных. Но что если у нас будет возможность проникнуть в структуру данных, способ увидеть связи между ними и отслеживать то, как они влияют друг на друга? Такой способ, чтобы не требовалось вскрытия скальпелем - все как с МРТ.
В докладе речь пойдет о собственных разработках в этой области.
Similar to Yuriy Sherstyuk - Algorithms in Front End: from V8 to VDOM (20)
'How i came up with my talk' by Yurii Artiukh. OdessaJS'2021OdessaJS Conf
The document describes the process by which someone decided on a topic for their presentation. They initially considered topics like animations or differential equations. After seeing an animation example, they wanted to create one themselves from 0 to 1, but struggled for over a day to get the math right. They eventually landed on an exponential function that achieved the desired animation effect over time. They questioned why they went through so much effort to figure this out.
Олексій Павленко. CONTRACT PROTECTION ON THE FRONTEND SIDE: HOW TO ORGANIZE R...OdessaJS Conf
The document discusses various approaches for performing contract protection on the frontend side such as integration testing, law-driven contract testing, consumer-driven contract testing, and runtime checking. It then focuses on runtime checking, explaining what it is and how it can add an extra step to quality assurance by allowing integration errors to be responded to in real time. Details are provided on Oleksii Pavlenko who is an engineering manager, PhD holder, and former professional basketball player with interests in surfing, snowboarding, and other boardsports.
Андрій Троян. Розробка мікросервісів з NestJS. OdessaJS'2021OdessaJS Conf
This document discusses NestJS, a framework for building Node.js microservices. It introduces microservices and their key characteristics like loose coupling and independent deployment. It then covers how NestJS provides an architecture that allows for highly testable, scalable, and maintainable applications. Specific NestJS features are summarized like modules, controllers, providers, pipes, error handling, and decorators. Finally, it discusses using NestJS for microservices, including different transporters and message styles like request-response and event-based communication.
Олексій Гончар "Використання Electron в розробці корпоративної відео-мессeндж...OdessaJS Conf
This document provides an overview of Electron and its history and principles. It then summarizes the RingCentral MVP platform, including its features and transition to using Electron. Finally, it describes the RingCentral desktop app, its features and technology, and its CI/CD processes. The document contains sections on Electron, the RingCentral MVP platform, and the RingCentral desktop app.
Максим Климишин "Що такого особливого у пропозиції вартості шаблону Micro Fro...OdessaJS Conf
Micro frontends is a design pattern that splits an application into multiple independently deployable frontend applications to reduce dependencies between teams and improve the speed of delivery. This approach can reduce execution and delivery risks like long cycle times and inconsistent user experiences. It allows for more autonomous teams and faster time to market. However, it also introduces some risks around broken user interfaces if components are not built consistently. Adopting a micro frontends approach requires buy-in from engineering leadership as well as change management to shift teams away from old habits.
Павло Галушко. GOOD CODE MYTHS. OdessaJS'2021OdessaJS Conf
The document discusses myths about writing good JavaScript code. Some myths addressed include: that good code is only for aesthetics; that programming is only about writing code; and that principles and patterns from object-oriented programming do not apply to JavaScript. The presentation argues that good code is important for business reasons like maintenance and refactoring costs. It emphasizes writing testable code, following style guides, and applying design principles universally.
'BUILDING ANGULAR APPS WITH NX' by Anastasia NecheporenkoOdessaJS Conf
This document discusses approaches to managing Angular applications, including using multiple repositories versus a monorepository. It notes advantages and disadvantages of each, such as isolation but also hard dependencies with multiple repos, versus easy code sharing but potential messiness with a monorepo. The document then introduces Nrwl Nx as an open-source tool that helps manage monorepos for Angular apps, providing features like dependency graphs, smart rebuilds, and code generators. However, it cautions that using Nx requires following its structure patterns and configurations, and migrating codebases and teams to its approach can also require effort.
'IS THERE JAVASCRIPT ON SWAGGER PLUGINS?' by Dmytro GusevOdessaJS Conf
This document discusses JavaScript plugins for the Swagger API documentation framework. It begins with an overview of Swagger and related tools like swagger-editor. It then covers challenges with customizing Swagger and different approaches tried, like using custom Swagger definitions or closures. The main topics covered are the plugin system architecture, including available React components, Redux state management, and plugin APIs. It asks several questions about how to interact with and extend the plugin system.
'ETHEREUM SMART CONTRACTS ON JS' by Yaroslav DvorovenkoOdessaJS Conf
This document discusses Ethereum, smart contracts, and blockchain technology. It defines Ethereum as a cryptocurrency platform that allows for decentralized services and applications through the use of smart contracts written in the Solidity programming language. Smart contracts are computer programs that automatically execute transactions, actions, and legally relevant events without the need for intermediaries. The document provides examples of how smart contracts could be used for elections, digital currency, and instant money transfers with low fees. It also discusses tools like Ganache, Truffle, and Web3.js that allow for developing, testing, and interacting with smart contracts and decentralized applications.
'MICROFRONTENDS WITH REACT' by Liliia KarpenkoOdessaJS Conf
This document discusses microfrontends architecture. It begins by explaining why an organization may want to use a microfrontends approach, such as when different teams in different locations need to work on the same project simultaneously. It then discusses some of the downsides of a monorepo approach and when a monorepo may be preferable to microfrontends. The document outlines some of the challenges microfrontends can present and why they can also be a good choice. It provides examples of how to divide an app into microfrontends, such as by routes, features, or a combination, and options for using different frameworks within microfrontends like web components, module federation, and iframes. It concludes by discussing testing and development
'Web performance metrics' BY ROMAN SAVITSKYI at OdessaJS'2020OdessaJS Conf
Let's brainstorm web-productivity? It's easy to get lost in different sources - so how to choose them wisely? Main topics: Metrics, best practices, problems and solutions
Вебпродуктивність. Що ще тут розповісти? Всі ми знаємо, що це важливо, як не отримувати таких проблем і до чого це призводить. Але якщо необхідно вирішити проблему серед тонни ресурсів важко обрати потрібний. Моя доповідь не тільки про рішення проблеми, а про находження інструментів та метрик для рішення проблеми. Чому саме ці метрики варто використовувати і як з цим жити. Метрики, практики, проблеми, рішення. Які різні поняття, а насправді це цепочки, які нам разом необхідно виставити в логічний ряд. Запрошую Вас побрейнштормити разом!
'JavaScript was invented in Odessa' by DMITRIY GUSEV at OdessaJS'2020OdessaJS Conf
JavaScript is wild and dangerous. I’ve been using it for years and time to time faced with the same issues.
Also being an interviewer I talked to lots of people.
And most of them able to answer the questions correctly, but can not explain why it works so. In my talk, I prepared examples of ‘what is wrong with JS’ and explained why it works so based on ECMA specifications.
'Why svelte' by BORYS MOHYLA at OdessaJS'2020OdessaJS Conf
I'll tell you why I chose Svelte. What I like about Svelte and what not. Let's talk about when to use Svelte in production and why.
The technology shows new possibilities of the composition of high-level abstractions and high-performance low-level code.
'Effective node.js development' by Viktor Turskyi at OdessaJS'2020OdessaJS Conf
How to develop NodeJS apps effectively? I will tell you all details and share his personal experience on the whole process: from the very start and up to the production stage.
You will also learn more about Docker, SDLC and 12 Factor App. Save the date!
18. 16
О-нотация - верхняя асимптотическая оценка
трудоёмкости алгоритма с точностью до
ограниченных множителей. При этом ошибка в
два раза или даже в тысячу раз считается
допустимой, а уже разница между n и n2
считается существенной.
23. 18
Базовые варианты О-нотаций:
1. О(1) - константная скорость роста
2. О(log n) - функции с логарифмической скоростью
роста
3. О(n) - функции с линейной скоростью роста
24. 18
Базовые варианты О-нотаций:
1. О(1) - константная скорость роста
2. О(log n) - функции с логарифмической скоростью
роста
3. О(n) - функции с линейной скоростью роста
4. О(n*log n) - функции с линейно–
логарифмической скоростью роста
25. 18
Базовые варианты О-нотаций:
1. О(1) - константная скорость роста
2. О(log n) - функции с логарифмической скоростью
роста
3. О(n) - функции с линейной скоростью роста
4. О(n*log n) - функции с линейно–
логарифмической скоростью роста
5. О(n2) - функции с квадратичной скоростью роста
26. 18
Базовые варианты О-нотаций:
1. О(1) - константная скорость роста
2. О(log n) - функции с логарифмической скоростью
роста
3. О(n) - функции с линейной скоростью роста
4. О(n*log n) - функции с линейно–
логарифмической скоростью роста
5. О(n2) - функции с квадратичной скоростью роста
6. О(2n) - функции с экспоненциальной скоростью
роста
27. 18
Базовые варианты О-нотаций:
1. О(1) - константная скорость роста
2. О(log n) - функции с логарифмической скоростью
роста
3. О(n) - функции с линейной скоростью роста
4. О(n*log n) - функции с линейно–
логарифмической скоростью роста
5. О(n2) - функции с квадратичной скоростью роста
6. О(2n) - функции с экспоненциальной скоростью
роста
7. О(n!) - функции с факториальной степенью роста
29. 20
«Структура данных - программная единица,
позволяющая хранить и обрабатывать
множество однотипных и/или логически
связанных данных в вычислительной технике.»
Wikipedia
30. 21
Основная дилемма при выборе алгоритма и
структур данных:
https://www.difference.wiki/ram-vs-processor
52. 30
Инициализировать свойства объекта в одном и
том же порядке
https://habr.com/post/154537
Инициализировать все объекты в
конструкторах, чтобы они как можно меньше
менялись в дальнейшем
54. 31
Оптимизировать массивы:
- Не стоит заставлять массивы перепрыгивать из одной
категории в другую (из непрерывных представлений в
хэш-таблицы)
https://habr.com/post/154537
55. 31
Оптимизировать массивы:
- Не стоит заставлять массивы перепрыгивать из одной
категории в другую (из непрерывных представлений в
хэш-таблицы)
- Используйте непрерывную нумерацию индексов,
начиная с 0 (в точности как в С)
https://habr.com/post/154537
56. 31
Оптимизировать массивы:
- Не стоит заставлять массивы перепрыгивать из одной
категории в другую (из непрерывных представлений в
хэш-таблицы)
- Используйте непрерывную нумерацию индексов,
начиная с 0 (в точности как в С)
- Не храните не числовые значения в числовых
массивах
https://habr.com/post/154537
59. 33
Метод sort
В V8 используется алгоритм Quicksort - один из самых
распространенных неустойчивых алгоритмов
внутренней сортировки со средней сложностью:
O(n*log n)
https://github.com/trekhleb/javascript-algorithms
60. 33
Метод sort
В V8 используется алгоритм Quicksort - один из самых
распространенных неустойчивых алгоритмов
внутренней сортировки со средней сложностью:
O(n*log n)
Quicksort заменил собой пирамидальную сортировку
Heapsort, для улучшения производительности
https://github.com/trekhleb/javascript-algorithms
61. 33
Метод sort
В V8 используется алгоритм Quicksort - один из самых
распространенных неустойчивых алгоритмов
внутренней сортировки со средней сложностью:
O(n*log n)
Quicksort заменил собой пирамидальную сортировку
Heapsort, для улучшения производительности
Но не везде выбор сортировки остановился именно на
Quicksort, например, в SpiderMonkey и Nitro (движок Firefox
и Safari) используется сортировка слиянием - Merge sort
https://github.com/trekhleb/javascript-algorithms
70. 40
С течением времени реализация сортировки
внутри V8 обзавелась множеством различных
оптимизаций:
71. 40
С течением времени реализация сортировки
внутри V8 обзавелась множеством различных
оптимизаций:
1. Изменился метод выбора опорного элемента
72. 40
С течением времени реализация сортировки
внутри V8 обзавелась множеством различных
оптимизаций:
1. Изменился метод выбора опорного элемента
2. Появилась хвостовая рекурсия
73. 40
С течением времени реализация сортировки
внутри V8 обзавелась множеством различных
оптимизаций:
1. Изменился метод выбора опорного элемента
2. Появилась хвостовая рекурсия
3. Изменился алгоритм работы на массивах малого
размера
76. 41
Метод выбора опорного элемента:
https://habr.com/post/265079
Изначально выбор был случайным
Затем, был изменен на выбор медианы из трех (первый,
последний и серединный элемент)
77. 41
Метод выбора опорного элемента:
https://habr.com/post/265079
Изначально выбор был случайным
Затем, был изменен на выбор медианы из трех (первый,
последний и серединный элемент)
В конечном итоге простой выбор медианы из
трех дополнился методом определения среднего
элемента для медианы на больших массивах (свыше
1000 элементов)
78. 42
Метод опорного элемента был изменен на:
var GetThirdIndex = function(a, from, to) {
var t_array = [];
// Use both 'from' and 'to' to determine the pivot candidates.
var increment = 200 + ((to - from) & 15);
for (var i = from + 1, j = 0; i < to - 1; i += increment, j++) {
t_array[j] = [i, a[i]];
}
%_CallFunction(t_array, function(a, b) {
return %_CallFunction(UNDEFINED, a[1], b[1], comparefn);
}, ArraySort);
var third_index = t_array[t_array.length >> 1][0];
return third_index;
}
https://habr.com/post/265079
80. 43
О хвостовой рекурсии
https://habr.com/post/265079
Проблема с двумя рекурсивными вызовами (на левую и
правую части массива) в том, что при неудачном
выборе опорного элемента глубина рекурсии будет
соизмерима с размером массива, что выливается в
оценку O(n) по памяти для худшего случая
81. 43
О хвостовой рекурсии
https://habr.com/post/265079
Проблема с двумя рекурсивными вызовами (на левую и
правую части массива) в том, что при неудачном
выборе опорного элемента глубина рекурсии будет
соизмерима с размером массива, что выливается в
оценку O(n) по памяти для худшего случая
Решение: сортировка вызывается рекурсивно только
для меньшего подмассива, а сортировка большего
продолжается в основном цикле, что дает оценку
потребления памяти O(log n)
82. 44
Алгоритмом работы на массивах малого
размера:
var InsertionSort = function InsertionSort(a, from, to) {
for (var i = from + 1; i < to; i++) {
var element = a[i];
for (var j = i - 1; j >= from; j--) {
var tmp = a[j];
var order = %_CallFunction(UNDEFINED, tmp, element, comparefn);
if (order > 0) {
a[j + 1] = tmp;
} else {
break;
}
}
a[j + 1] = element;
}
};
https://habr.com/post/265079
85. function sumTo(n) {
var result = 0;
for (var i = 1; i <= n; i++) {
result += i;
}
return result;
}
function sumToRec(n) { // рекурсия
return n == 1 ? 1 : n + sumToRec(n - 1);
}
var timeLoop = performance.now();
for (var i = 1; i < 1000; i++) sumTo(1000); // цикл
timeLoop = performance.now() - timeLoop;
var timeRecursion = performance.now();
for (var i = 1; i < 1000; i++) sumToRec(1000); // рекурсия
timeRecursion = performance.now() - timeRecursion;
alert( "Разница в " + (timeRecursion / timeLoop) + " раз" );
47
92. 53
Методы работы с DOM-деревом
Операция Сложность Метод
Добавление О(1)
insertBefore, appendChild, append, prepend, after,
before
Удаление О(1) removeChild, remove, replaceWith
Поиск О(1)/O(n)
querySelector, querySelectorAll, getElementById,
getElementsByClassName
93. 54
Поисковые методы get* и querySelector* внутри
устроены очень по-разному для работы с
DOM-деревом
100. 58
React
Для перерисовки одного DOM-дерева в другое
потребуется алгоритм с оценкой - O(n3), где n - количество
элементов
https://grfia.dlsi.ua.es/ml/algorithms/references/editsurvey_bille.pdf
101. 58
React
Для перерисовки одного DOM-дерева в другое
потребуется алгоритм с оценкой - O(n3), где n - количество
элементов
Так появился алгоритм Reconciliation и удалось добиться
оценки - O(n)
https://grfia.dlsi.ua.es/ml/algorithms/references/editsurvey_bille.pdf
102. 58
React
Для перерисовки одного DOM-дерева в другое
потребуется алгоритм с оценкой - O(n3), где n - количество
элементов
Так появился алгоритм Reconciliation и удалось добиться
оценки - O(n)
https://grfia.dlsi.ua.es/ml/algorithms/references/editsurvey_bille.pdf
103. 59
Дополнительная оптимизация по индексам
Старое дерево
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
104. 59
Дополнительная оптимизация по индексам
Старое дерево
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
105. 59
Дополнительная оптимизация по индексам
Старое дерево
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
<li>Первый</li>
<li>Третий</li>
106. 59
Дополнительная оптимизация по индексам
Старое дерево
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
<li>Первый</li>
<li>Третий</li>
<li>Первый</li>
107. 59
Дополнительная оптимизация по индексам
Старое дерево
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
<li>Первый</li>
<li>Третий</li>
<li>Первый</li>
108. 59
Дополнительная оптимизация по индексам
Старое дерево
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
<li>Первый</li>
<li>Третий</li>
<li>Первый</li>
<li>Третий</li>
109. 59
Дополнительная оптимизация по индексам
Старое дерево
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
<li>Первый</li>
<li>Второй</li>
<li>Третий</li>
<li>Первый</li>
<li>Третий</li>
<li>Первый</li>
<li>Третий</li>
111. 60
Дополнительная оптимизация по индексам
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Новое дерево Результат
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Старое дерево
112. 60
Дополнительная оптимизация по индексам
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
Хэш-таблица
КомпонентКлюч
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
key1
key2
key3
Новое дерево Результат
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Старое дерево
113. 60
Дополнительная оптимизация по индексам
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
<li key=«key1»>1</li>
<li key=«key3»>3</li>
Хэш-таблица
КомпонентКлюч
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
key1
key2
key3
Новое дерево Результат
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Старое дерево
114. 60
Дополнительная оптимизация по индексам
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
<li key=«key1»>1</li>
<li key=«key3»>3</li>
Хэш-таблица
КомпонентКлюч
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
key1
key2
key3
<li key=«key1»>1</li>
Новое дерево Результат
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Старое дерево
115. 60
Дополнительная оптимизация по индексам
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
<li key=«key1»>1</li>
<li key=«key3»>3</li>
Хэш-таблица
КомпонентКлюч
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
key1
key2
key3
<li key=«key1»>1</li>
<li key=«key3»>3</li>
Новое дерево Результат
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Старое дерево
116. 60
Дополнительная оптимизация по индексам
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
<li key=«key1»>1</li>
<li key=«key3»>3</li>
Хэш-таблица
КомпонентКлюч
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
key1
key2
key3
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Новое дерево Результат
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Старое дерево
117. 60
Дополнительная оптимизация по индексам
https://www.youtube.com/watch?v=nocJsLFPjNk Владимир Дашукевич
<li key=«key1»>1</li>
<li key=«key3»>3</li>
Хэш-таблица
КомпонентКлюч
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
key1
key2
key3
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Новое дерево Результат
<li key=«key1»>1</li>
<li key=«key2»>2</li>
<li key=«key3»>3</li>
Старое дерево
120. 63
Что изменилось:
- Reconciliation адаптирован в React Stack
- Вся работа разделена на волокна - fibers
(виртуальные стек-контейнеры)
- Взаимодействие с браузером через:
requestAnimationFrame и requestIdleCallback
- Появились фазы
- Созданы приоритеты и использована структура данных:
Очередь с приоритетами через связанный список
124. 65
Фазы:
Render / Reconciliation phase - в ней Fiber строит
work-in-progress tree (может быть прервана)
Commit phase - внесение изменений из предыдущей
стадии в DOM (эту стадию прервать не удастся)
125. 66
Приоритеты:
0. NoWork - Нет приоритета
1. SynchronousPriority - Действие, которое необходимо
выполнить немедленно (пользовательский ввод)
2. TaskPriority - Обычная задача
3. AnimationPriority - Пользовательские анимации (все,
что приводит к изменению DOM-узлов)
4. HighPriority - Задачи с высоким приоритетом
(например: скроллинг)
5. LowPriority - Низкий приоритет (например:
перерисовка компонента с получением данных store)
6. OffscreenPriority - Перерисовка элементов, которые
не видны на экране сейчас.
126. 66
Приоритеты:
0. NoWork - Нет приоритета
1. SynchronousPriority - Действие, которое необходимо
выполнить немедленно (пользовательский ввод)
2. TaskPriority - Обычная задача
3. AnimationPriority - Пользовательские анимации (все,
что приводит к изменению DOM-узлов)
4. HighPriority - Задачи с высоким приоритетом
(например: скроллинг)
5. LowPriority - Низкий приоритет (например:
перерисовка компонента с получением данных store)
6. OffscreenPriority - Перерисовка элементов, которые
не видны на экране сейчас.
127. 67
Очередь с приоритетами
использует связанный список
Операция/Сложность Связанный список
Добавление элемента О(n)
Получение элемента О(1)
Поиск максимального элемента О(1)
160. 81
Не всем всегда и сразу нужно знать алгоритмы
JavaScript - уже не тот, все больше логики происходит
на клиенте, не говоря о NodeJS
161. 81
Не всем всегда и сразу нужно знать алгоритмы
JavaScript - уже не тот, все больше логики происходит
на клиенте, не говоря о NodeJS
Алгоритмы и структуры данных - это скорее способ
организации мышления
162. 81
Не всем всегда и сразу нужно знать алгоритмы
JavaScript - уже не тот, все больше логики происходит
на клиенте, не говоря о NodeJS
Алгоритмы и структуры данных - это скорее способ
организации мышления
Выгодно инвестировать в фундаментальные знания