Python (+numba) быстрее Си — серьёзно?! Часть 1. Теория
Давно собирался написать статью о numba и о сравнении её быстродействия с си. Статья про хаскелл «Быстрее, чем C++; медленнее, чем PHP» подтолкнула к действию. В комментариях к этой статье упомянули о библиотеке numba и о том, что она магическим образом может приблизить скорость выполнения кода на питоне к скорости на си. В данной статье после небольшого обзора по numba (часть 1) чуть более подробный разбор этой ситуации (часть 2).
Python (+numba) быстрее Си — серьёзно?! Часть 2. Практика
Это вторая часть статьи про numba. В первой было историческое введение и краткая инструкция по эксплуатации numba. Здесь я привожу слегка модифицированный код задачи из статьи про хаскелл «Быстрее, чем C++; медленнее, чем PHP» (там сравнивается производительность реализаций одного алгоритма на разных языках/компиляторах) с более детальными бенчмарками, графиками и пояснениями. Сразу оговорюсь, что я видел статью Ох уж этот медленный C/C++ и, скорее всего, если внести в код на си эти правки, картина несколько изменится, но даже в этом случае то, что питон способен превысить скорость си хотя бы в таком варианте, само по себе является примечательным.
Автоматное программирование. Часть 4. Эффективность автоматно-спроектированных программ
Я бы сформулировал вопрос иначе: насколько эффективны автоматно-спроектированные программы? Такая формулировка вопроса намекает, что автоматное проектирование — источник высокой эффективности программ. Я ещё практически не касался столь важной темы как эффективность, и пример «Дисплей» идеально подходит для иллюстрации эффективности автоматного проектирования. В первой статье я познакомил читателей с «лабораторной» версией этого модуля, но тестировать я буду «боевой» вариант, процесс проектирования которого я приведу в следующей статье. Исследование эффективности будет выполнено для платформ msp430 и CortexM3.
Чтобы не быть субъективным, оценивая эффективность, нужно с чем-то сравнивать результаты. Поэтому я проведу тот же комплекс испытаний для неавтоматной реализации примера «Дисплей» любезно предоставленной michael_vostrikov, за что ему огромная благодарность и плюсы в карму.
Автоматный практикум — 1. Пример «Дисплей», разработка ОА и УА
Как мы разогнали САПР КОМПАС-3D → Часть 2
Продолжим рассказом о варианте отрисовки «Улучшенный».
Как мы разогнали САПР КОМПАС-3D → Часть 3
Как оценить компьютеры, которые пока ещё не совсем существуют
Для оценки быстродействия суперкомпьютера специалисты по информатике обращаются к стандартному инструменту: набору алгоритмов LINPACK, помогающему проверить, как машина способна решать задачи с огромным количеством переменных. Но для квантовых компьютеров, которые однажды смогут решать задачи, недоступные обычным компьютерам, такого стандарта по измерению быстродействия не существует.
Одна из причин состоит в том, что компьютеры, которые должны будут задействовать законы квантовой механики для ускорения определённых вычислений, пока что находятся в рудиментарном состоянии, а различные возможные схемы устройства таких компьютеров конкурируют между собой. В некоторых из них квантовые биты, или кубиты, используемые для вычисления, заключены в спины последовательности «пойманных» ионов, другие же полагаются на кусочки сверхпроводящих металлов, резонирующих в ответ на микроволновое излучение. Сравнение зачаточных архитектур похоже на то, «как если бы мы отправились в ясли, чтобы решить, какие из младенцев станут известными баскетболистами», говорит Скотт Ааронсон, специалист по информатике из Техасского университета в Остине.
Насколько быстры компьютеры
Время для компьютеров течет не так, как для людей. То, что человеческим мозгом воспринимается как мгновение, для компьютеров растягивается на долгие эпохи. Данная статья — это метафора, в попытке осознать это простой и в общем-то очевидный факт.
Переизобретаем сжатие в распределенной базе данных
В используемой нами базе данных уже была эффективная функциональность сжатия, которая обеспечивала хранение объемной информации.
Но рост объема хранимых данных — не единственный возможный выигрыш от применения сжатия, поэтому мы задумались о разработке собственного решения.
В этой статье расскажу, как мы изменили подход к сжатию данных, чем пришлось пожертвовать и почему менее эффективное «на бумаге» решение в результате превзошло наши ожидания.
Мгновенное заполнение последовательности выбранных ячеек физической памяти
(продолжение работы над своим процессором, и в заголовке про физическую память так как везде поисковиком находится про ячейки Excell).
Сначала думал - да ну какая мелочь для процессора, но потом подумал - многие пишут о мелочах и даже получают плюсы, почему не написать о мелочи, если чип создаётся новый.
Сразу говорю, что роль памяти в данной схеме играют SR триггеры предполагаемого FPGA и процедура заполнения любого числа цепи ячеек (или даже одной) выполняется за два рабочих такта проектируемого процессора, независимо от числа выбранных ячеек. Над этой задачкой пришлось немного пломать голову, и нужно было понять что такое управляемый буфер (в данном случае это для Logisim Evolution).
После того, как составил рабочую схему кэша мостов, для работы процессора в режиме без счётчика команд, приступил к схеме управления кэшом мостов. Кэш мостов - это кэш обеспечивающий выполнение команд без счётчика команд, и позволяющий выполнять только команды в обозначенных ячейках памяти. По сути управление кэшем мостов сводится к мгновенному заполнению групп выбранных ячеек. И вот для того чтобы обеспечить бесперебойную работу управляемых буферов в сложной цепи (множество ячеек и множество источников сигнала) пришлось пойти на Хитрость с ИСКЛЮЧАЮЩИМ ИЛИ.
Триггеры группы Last - нижний ряд триггеров на данном изображении, служит для обозначения последнего триггера данной группы для конкретной ячейки, в который запишется единица и заблокирует прохождение сигнала по верхнему проводнику, через который подряд записывается единица в сами эти ячейки памяти механизма управления кэшем мостов - в триггеры группы Memo (незаконченное слово, так как по сути всё это является устройством для управления памятью, а не ей самой).
Сложные цепи из последовательных звеньев и параллельных шин — согласование цифрового сигнала внутри таких схем
Нет согласующих резисторов в FPGA - что мешает реализовать целый ряд схем, но зато есть чем заменить их для цифрового сигнала внутри таких схем. Пытался найти в сети альтернативу согласующему резистору для применения внутри синтезируемой схемы, поисковик выдал скромный результат поиска, содержанием которого оказалось ничего по существу - категоричное нет на всех форумах, и иногда что-то близкое, но моей задачи не решающее. Да и собственно в схеме развёрнуты две задачи - некоторый кэш нового типа и механизм управления таким кэшем, по сути - часть процессора нового типа.
Тут нужно много вникать. И если Вы не верите IDE Logisim Evolution - можете просто пройти мимо и не принимать тут изложенный материал во что-то нужное и полезное. Тем более что это в общем-то работа новичка, который просто развивает свой проект и взгляды в новых областях, сталкивается с новыми задачами и решает их новыми способами.
JavaScript: ограничение частоты исполнения функции
Исходные данные: ресурсоёмкая функция, обновляющая определённые элементы на экране по наступлению определённых событий (движение мышки, например).
Проблема: когда события, вызывающие функцию, происходят слишком часто за короткий промежуток времени, интерфейс может начать серьёзно тормозить. Скажем, если событие произойдёт 1000 раз за несколько секунд, то и обновление — столько же. Для интерфейса молниеносная скорость отрисовки изменений может быть не так важна, а вот общее быстродействие, которое в данном случае страдает — очень даже.
Задача: ограничить функцию таким образом, чтобы она исполнялась не чаще, чем раз за определённый промежуток времени. При достаточном малом таком промежутке визуально задержки не будут заметны, зато кол-во вызовов может сократиться в несколько раз, что в свою очередь очень сущесвенно сократит нагрузку и поможет избавиться от торможения.
Ускорение Оперы, часть 1
- Flash часто загружает всю виртуальную машину Java из-за технологии Live Connect (она часто бывает совершенно лишней);
Также очень увеличивает использование памяти Оперой.
(Как отключить: operawiki.info/FlashBlock)
Попробуйте «Удалить личные данные», если вы считаете это оправданым для повышения произвдительности (действительно хорошо помогает в большинстве случаев)
Если ваши оптимизаторские наклонности достигают маниакальной степени, отключите JavaScript
(попробуйте нажать F12 и вы увидите удобную менюшку, где можете сделать еще много всякого)
Включите «Принимать все Cookies» (Это также повлияет на вашу безопасность, www.opera.com/support/tutorials/security/privacy) (лично я не знаю, как это влияет на производительность, но на официальной wiki так пишут)
Отключите FavIcons ( Prefs » Advanced » Browsing » Page Icons )
Отключите спец.эффекты UI и используйте родной скин (он потребляет меньше ресурсов)
Храните кэш на диске отличном от того, куда установлена ось, делайте иногда дефрагментацию этого диска
Вы можете распаковать исполнимые файлы (http://operawiki.info/PackedExecutables)
Если у вас кроме Опервы не открты другие программы, задайте приоритет процесса Opera в 'High' через диспетчер задач
Материал по operawiki.info/OperaPerformance (EN) и с множества форумов.
Завтра читайте продолжение, если в комментариях будут интересные заметки на тему — я их учту, так что пишите.
Спасибо за внимание, это пока только общие рекомендации, в продолжении будет больше, надеюсь, кому-то это окажется полезным.
Ускорение Оперы, часть 1
- Flash часто загружает всю виртуальную машину Java из-за технологии Live Connect (она часто бывает совершенно лишней);
Также очень увеличивает использование памяти Оперой.
(Как отключить: operawiki.info/FlashBlock)
Попробуйте «Удалить личные данные», если вы считаете это оправданым для повышения произвдительности (действительно хорошо помогает в большинстве случаев)
Если ваши оптимизаторские наклонности достигают маниакальной степени, отключите JavaScript
(попробуйте нажать F12 и вы увидите удобную менюшку, где можете сделать еще много всякого)
Включите «Принимать все Cookies» (Это также повлияет на вашу безопасность, www.opera.com/support/tutorials/security/privacy) (лично я не знаю, как это влияет на производительность, но на официальной wiki так пишут)
Отключите FavIcons ( Prefs » Advanced » Browsing » Page Icons )
Отключите спец.эффекты UI и используйте родной скин (он потребляет меньше ресурсов)
Храните кэш на диске отличном от того, куда установлена ось, делайте иногда дефрагментацию этого диска
Вы можете распаковать исполнимые файлы (http://operawiki.info/PackedExecutables)
Если у вас кроме Опервы не открты другие программы, задайте приоритет процесса Opera в 'High' через диспетчер задач
Материал по operawiki.info/OperaPerformance (EN) и с множества форумов.
Завтра читайте продолжение, если в комментариях будут интересные заметки на тему — я их учту, так что пишите.
Спасибо за внимание, это пока только общие рекомендации, в продолжении будет больше, надеюсь, кому-то это окажется полезным.
Ускорение Оперы, часть 1
- Flash часто загружает всю виртуальную машину Java из-за технологии Live Connect (она часто бывает совершенно лишней);
Также очень увеличивает использование памяти Оперой.
(Как отключить: operawiki.info/FlashBlock)
Попробуйте «Удалить личные данные», если вы считаете это оправданым для повышения произвдительности (действительно хорошо помогает в большинстве случаев)
Если ваши оптимизаторские наклонности достигают маниакальной степени, отключите JavaScript
(попробуйте нажать F12 и вы увидите удобную менюшку, где можете сделать еще много всякого)
Включите «Принимать все Cookies» (Это также повлияет на вашу безопасность, www.opera.com/support/tutorials/security/privacy) (лично я не знаю, как это влияет на производительность, но на официальной wiki так пишут)
Отключите FavIcons ( Prefs » Advanced » Browsing » Page Icons )
Отключите спец.эффекты UI и используйте родной скин (он потребляет меньше ресурсов)
Храните кэш на диске отличном от того, куда установлена ось, делайте иногда дефрагментацию этого диска
Вы можете распаковать исполнимые файлы (http://operawiki.info/PackedExecutables)
Если у вас кроме Опервы не открты другие программы, задайте приоритет процесса Opera в 'High' через диспетчер задач
Материал по operawiki.info/OperaPerformance (EN) и с множества форумов.
Завтра читайте продолжение, если в комментариях будут интересные заметки на тему — я их учту, так что пишите.
Спасибо за внимание, это пока только общие рекомендации, в продолжении будет больше, надеюсь, кому-то это окажется полезным.
Архитектура YASS. Часть 3: проблема выбора
Условное ветвление
Начнем с наиболее очевидной составляющей любой логики: ветвления. В любом алгоритме встречается место, в котором нужно выбрать то или иное продолжение в зависимости от проверяемого условия. Давайте рассмотрим следующие примеры. В первом случае у нас три простых вложенных проверки:
var a = 1, b = 2, c = 3; if(a == 1) { if (b == 2) { if (c == 3) { ... } } }
Маленькая хитрость для отображения большого объёма данных в ListView
В этой статье я хочу поделиться недавно найденным решением, позволяющем отображать, а главное легко скролить большие объёмы данных в стандартном ListView.
Проблема
Стандартный механизм отображения списков из базы данных в Android выглядит примерно так:
- Activity содержит ListView
- ListView обращается к экземпляру CursorAdapter
- CursorAdapter получает данные из объекта, реализующего интерфейс Cursor
- Cursor получен либо из ContentProvider, либо сразу из SQLiteDatabase
Всё работает нормально ровно да тех пор, пока количество строк в Cursor сравнительно небольшое. Но если в нём 50 тысяч, 100 тысяч и более строк (хотя дело не только в количестве строк, но об этом чуть позже), время от времени список будет притормаживать. Особенно это заметно при «быстрой прокрутке», если у ListView установлено в true свойство fastScrollEnabled.
Насколько плохим код должен быть?
На прошлой неделе в комментариях к одной из статей разгорелся спор о роли низкоуровневой оптимизации в программировании, и я вспомнил относящуюся к этому статью Эрика. Она была написана в конце 2003, и хотя реалии с тех пор несколько изменились — принципы остались теми же самыми. Можете мысленно заменить ASP и VBScript на PHP, JavaScript, или на другой скриптовый язык по вашему вкусу.
Эту статью я уже пытался перевести в 2005, но русский текст тогда получился неуклюжий, так что этот перевод — новый и ранее не публиковался, в соответствии с требованиями НЛО. В Переводе блога Эрика Липперта этого текста тоже нет — наверное, для них он слишком стар.
Я уже много писал о быстродействии скриптов, но до сих пор я не высказывался по поводу того, что многие советы об их оптимизации я считаю как минимум бестолковыми, а то и откровенно вредными.
Например, за семь лет в Microsoft я получил десятки вопросов, аналогичных по своей сути этому, заданному в конце 1990-х:
У нас есть код на VBScript, и в одной часто вызываемой функции мы определяем оператором Dim
несколько переменных, которые нигде в функции не используются. Не замедляется ли каждый вызов функции из-за объявления этих переменных?
Какой интересный вопрос! В компилируемом языке, таком как Си, объявление локальных переменных общим размером n байт всего лишь вычитает n из указателя стека при входе в функцию. Если n будет чуть больше или чуть меньше, затраты времени на вычитание никак не изменятся. Наверное, в VBScript точно так же? Оказалось, что нет! Вот что я написал автору вопроса: