Полное название статьи должно было звучать как «Устойчивая „топологическая“ сортировка графа с циклами за O(|V| + |e| log |e|) по времени и O(|V|) по памяти без рекурсии», но мне сказали что это перебор.
Читать полностью »
Рубрика «оптимизация программ» - 2
«Топологическая» сортировка графа с циклами
2019-05-10 в 16:25, admin, рубрики: linux, Алгоритмы, графы, дискретная математика, математика, оптимизация программКак сэкономить ресурсы в браузере и не сломать веб. Доклад Яндекса
2019-03-04 в 8:55, admin, рубрики: chromium, discard, hibernate, Алгоритмы, Блог компании Яндекс, браузеры, интерфейсы, оптимизация программ, производительность javascript, Разработка веб-сайтов, рендеринг, слои, тайлинг, тайлы, яндекс.браузерНесмотря на рост производительности устройств, веб становится всё более требовательным к памяти и процессору. Правильный рендеринг и умное распределение ресурсов по вкладкам — важная часть решения этой проблемы. Константин Крамлих посвятил своё выступление на конференции «Я Frontend» алгоритмам, которые улучшают производительность и экономят ресурсы как в проекте Chromium, так и в Яндекс.Браузере.
Некоторые из них — например, технологию Hibernate — мы уже разбирали в отдельном посте. Доклад Кости освещает задачу более широко: не только с точки зрения переключения вкладок, но и с учетом методов отрисовки контента, тайлов и слоев страницы.
Ближе к концу разработчики веб-интерфейсов могут узнать, как выявлять и решать проблемы с производительностью сайтов.
— Меня зовут Костя, я руководитель группы разработки внутренних компонентов в команде Яндекс.Браузера. В Браузере я чуть больше пяти лет, занимался разными вещами: от всего декодирования в браузере, всех HTML5-видео, до отрисовки, рендеринга и других подобных процессов.
К вопросу о кривых Безье, быстродействии Ардуино и одном интересном сайте, или как я провел выходные
2018-10-31 в 9:27, admin, рубрики: микроконтроллеры, оптимизация программ, программирование микроконтроллеров«Решить парадокс Грея с дельфинами может любой, а ты попробуй сделать это без дельфинов. »

Вообще то планировал я провести выходные несколько по иному, съездить на Copter Huck (не то, чтобы я был фанатом коптеров, просто посмотреть, что молодежь придумывает, потусоваться типа), но старшая сестра была категорически против. Я, конечно, настаивал (то есть пару раз хмыкнул и сказал" Ну может, все-таки… будет прикольно"), но она была неумолима, а когда супруга приняла ее сторону, шансов на поездку не осталось. Ну и ладно, «не очень то и хотелось», зато немного посидел над забавной задачкой из области программирования, которую сам себе придумал, о чем и докладываю.
( Необходимое примечание — имелись в виду предыдущие выходные, вот так всегда — написание программы требует пары часов, написание отчета о ней и за пять дней поездок в общественном транспорте не завершено.)
В одном недавнем посте автор рассматривал задачу ускорения (кроме всего прочего) расчета кривых Безье (КБ) на МК со сравнительно слабыми параметрами. Ну на самом деле эти параметры на уровне среднего мейнфрейма 70х годов, но по нынешним временам считаются явно недостаточными. В результате определенных действий автору удалось несколько ускорить вычисления, на мой взгляд, явно недостаточно, вот и решил написать, как это следует делать в первом приближении. Я прекрасно знаю универсальный рецепт решения проблем с быстродействием — взять МК с частотой повыше или перейти на другое семейство, но я родом из тех времен, когда мы учились обходится тем, что есть, просто потому, что ничего другого не было, от слова совсем. По нынешним временам подход устаревший, но мне показалось, что будет не безынтересен и современным читателям Хабра.
Читать полностью »
Ускорение сборки C и C++ проектов
2017-12-12 в 14:44, admin, рубрики: C, c++, precompiled headers, unity builds, Блог компании PVS-Studio, кэш компилятора, оптимизация кода, оптимизация программ, параллельная компиляция, Программирование, сборка проектаМногие программисты не понаслышке знают о том, что программа на языке C и C++ собирается очень долго. Кто-то решает эту проблему, сражаясь на мечах во время сборки, кто-то — походом на кухню «выпить кофе». Это статья для тех, кому это надоело, и он решил, что пора что-то предпринять. В этой статье разобраны различные способы ускорения сборки проекта, а также лечение болезни «поправил один заголовочный файл — пересобралась половина проекта».

Поговорим о микрооптимизациях на примере кода Tizen
2017-07-17 в 7:02, admin, рубрики: C, c/c++, c++, open source, pvs-studio, tizen, tizen os, Блог компании PVS-Studio, код, микрооптимизация, оптимизация кода, оптимизация программ, разработка операционных систем, Разработка под Tizen, рефакторинг, Си, си/си++, статический анализ кода
Как правило, при обсуждении диагностических возможностей PVS-Studio за кадром остаются рекомендации, выдаваемые анализатором по поводу микрооптимизаций Си и Cи++ кода. Конечно, микрооптимизации не так важны, как диагностики выявляющие ошибки, но про них тоже интересно поговорить.
Читать полностью »
Своевременная оптимизация
2017-03-14 в 9:53, admin, рубрики: Анализ и проектирование систем, оптимизация, оптимизация кода, оптимизация программ, правила программирования, правила проектирования, Программирование, Совершенный кодВсем известно, что преждевременная оптимизация — это плохо и надо себя одёргивать когда, возникает желание пооптимизировать не вовремя. Однако на практике чаще бывает ситуация когда естественное (и, возможно, интуитивно правильное) желание пооптимизировать подавляется по принципу «если вообще не оптимизировать — это не будет преждевременно». Либо так:

На мой взгляд, подобные ситуация возникают потому, что границы понятия «преждевременности» весьма нечёткие и интуитивные, как будто это что-то эмпирическое и неуловимое вроде сочности хруста французской булки.
Хотя в принципе довольно странно оперировать какими-то эмпирическими понятиями по отношению к архитектуре программ, алгоритмам и их оптимизации — поскольку это вполне измеримые вещи. А значит — можно достаточно просто измерить своевременность оптимизации. Об этом и поговорим.
Читать полностью »
Усовершенствуем функцию ВПР в Excel
2016-11-02 в 15:55, admin, рубрики: excel формула, UDF, Алгоритмы, бинарный поиск, ВПР, макросы, оптимизация программ, ПрограммированиеПрочтение публикации Упрощаем бинарный поиск в Excel сподвигло на дополнительное усовершенствование функции ВПР по сравнению с приведенным в статье.
Что не было учтено, и что хотелось бы добавить:
Упрощаем бинарный поиск в Excel — реализация Double VLOOKUP Trick с помощью UDF
2016-10-24 в 18:04, admin, рубрики: excel формула, UDF, Алгоритмы, бинарный поиск, ВПР, высокая производительность, макросы, оптимизация программ, Разработка под e-commerce, Семантика, метки: excel формула, UDFДобавлю в копилку статей Хабра о Бинарном поиске еще одну.
Речь пойдет о кастомной реализации, может быть полезно всем, кто часто использует в работе ВПР для сравнения больших списков или для поиска данных в больших массивах.
Предыстория
Все началось с того, что я открыл для себя т.н. Double-TRUE VLOOKUP trick (трюк с двойным использованием ВПР и ИСТИНА в 4-м параметре). Развернутое описание алгоритма можно найти в статье Charles Williams «Why 2 VLOOKUPS are better than 1 VLOOKUP» (в конце статьи).
Поняв принцип работы и открыв для себя, что этот подход может быть в тысячи раз быстрее обычного линейного поиска (ВПР с 4-м параметром ЛОЖЬ), я начал продумывать варианты раскрыть его возможности. В ходе реализации получилось несколько годных инструментов для контекстной рекламы, один из которых я еще продолжаю улучшать, и уже посвятил проекту пару статей на Хабре. Чтиво рекомендуется SEO-специалистам и специалистам по контекстной рекламе (сразу оговорюсь, по ссылкам в статьях уже устаревшие версии, последняя версия условно 6.0, ссылки на скачивание всех версий, включая самую свежую, будут в конце этой статьи):
Анализ больших семантических ядер, или «Робот-распознаватель»
Лемматизация в Excel, или «Робот-распознаватель 3.0
Так вот, несмотря на невероятную скорость работы этих файлов (невероятную для Excel), их создание потребовало использования таких же невероятно длинных мегаформул как одной из составляющих работы макросов (в последней из вышеуказанных статей приведен пример — формула на 3215 символов). И всему виной сложный синтаксис функции.
Если набить руку с его использованием, он перестает казаться сложным, но неискушенным пользователям, для которых предназначен такой подход, вряд ли захочется разбираться в нем.
Синтаксис выглядит так: Если(ВПР(искомое; массив;1; ИСТИНА)<искомое;""; ВПР(искомое; массив;n; ИСТИНА))
где n — порядковый номер столбца, из которого мы хотим вернуть значение напротив искомого ключа.
Вместо «ИСТИНА» в 4-м параметре можно использовать «1» для номинального сокращения длины формул, это не меняет их сути.
Если озвучить ход работы формулы, будет нижеследующее:
«Если бинарный поиск ключа по первому столбцу массива возвращает значение, меньшее, чем сам ключ, возвращаем пустую строку. Иначе — возвращаем результат бинарного поиска ключа со смещением n»
Подход используется для того, чтобы не возвращать никаких значений, если искомый ключ в массиве отсутствует, т.к. зачастую, если искомое не найдено — нам не нужно меньшее значение. Так сказать, все или ничего. Вкратце, в этом и есть суть «трюка».
Напомню, на карту поставлен прирост скорости, исчисляющийся трех-четырехзначными числами. Если подходить чисто математически — на массиве в 2^20 строк обычный бинарный поиск будет делать ~10 вычислений, формула выше — около 20, в то время, как линейный поиск — ~500.000, т.е. прирост формулы выше — в 25.000 раз. Если голые цифры не впечатляют, более красноречивое эквивалентное сравнение — 1 секунда против ~7 часов.
На практике прирост не столь существенный (в конце статьи ссылка на статью, где сравнивались разные способы). Это во многом связано с затратами процессорного времени на дополнительные процедуры, которые выполняет программа (например, запись значений в ячейки). НО прирост по-прежнему критически значимый (~4000 раз).
Но одновременно с этим мы имеем сложный, совершенно неюзабельный синтаксис. Не всем смертным дался ВПР, что говорить о комбинациях 2х ВПР с ЕСЛИ.
Вопрос со сложным синтаксисом я решил с помощью VBA — написал UDF (user-defined function, пользовательская функция), которая прячет под капот наши условные конструкции, оставляя нам привычный синтаксис всем известного ВПР.
Код UDF:
Читать полностью »
Оптимизация кода: память
2016-10-10 в 15:05, admin, рубрики: C, c++, высокая производительность, компилятор оптимизация, Компиляторы, оптимизация программ, программирование микроконтроллеров, производительность, процессор, язык cБольшинство программистов представляют вычислительную систему как процессор, который выполняет инструкции, и память, которая хранит инструкции и данные для процессора. В этой простой модели память представляется линейным массивом байтов и процессор может обратиться к любому месту в памяти за константное время. Хотя это эффективная модель для большинства ситуаций, она не отражает того, как в действительности работают современные системы.
В действительности система памяти образует иерархию устройств хранения с разными ёмкостями, стоимостью и временем доступа. Регистры процессора хранят наиболее часто используемые данные. Маленькие быстрые кэш-памяти, расположенные близко к процессору, служат буферными зонами, которые хранят маленькую часть дынных, расположеных в относительно медленной оперативной памяти. Оперативная память служит буфером для медленных локальных дисков. А локальные диски служат буфером для данных с удалённых машин, связанных сетью.

Иерархия памяти работает, потому что хорошо написанные программы имеют тенденцию обращаться к хранилищу на каком-то конкретном уровне более часто, чем к хранилищу на более низком уровне. Так что хранилище на более низком уровне может быть медленнее, больше и дешевле. В итоге мы получаем большой объём памяти, который имеет стоимость хранилища в самом низу иерархии, но доставляет данные программе со скоростью быстрого хранилища в самом верху иерархии.
Читать полностью »
Оптимизация кода: процессор
2016-09-12 в 15:32, admin, рубрики: C, c++, высокая производительность, компилятор оптимизация, Компиляторы, оптимизация программ, программирование микроконтроллеров, производительность, процессор, язык cВсе программы должны быть корректными, но некоторые программы должны быть быстрыми. Если программа обрабатывает видео-фреймы или сетевые пакеты в реальном времени, производительность является ключевым фактором. Недостаточно использовать эффективные алгоритмы и структуры данных. Нужно писать такой код, который компилятор легко оптимизирует и транслирует в быстрый исполняемый код.

В этой статье мы рассмотрим базовые техники оптимизации кода, которые могут увеличить производительность вашей программы во много раз. Мы также коснёмся устройства процессора. Понимание как работает процессор необходимо для написания эффективных программ.
Читать полностью »
