Как стать автором
Обновить
225
0
Акиньшин Андрей @DreamWalker

Performance Methodologist at JetBrains

Отправить сообщение

Подарок на 1 сентября всем поклонникам цифровой схемотехники и архитектуры компьютера

Время на прочтение2 мин
Количество просмотров29K
hh2e_lecture_slides_banner_3

Господа! Сегодня на 1 сентября, в День Знаний, группа из украинских преподавателей вузов, их аспиранток, а также российских инженеров, решили, по согласованию с британскими издателями Elsevier через компанию Imagination Technologies, сделать небольшой подарок всем учителям компьютерной архитектуры и цифровой схемотехники, особенно тем, которые используют популярный учебник Дэвида Харриса и Сары Харрис.

Просто нажмите вот на эту ссылку и вы получите zip-файл с слайдами для чтения лекций по этому учебнику на русском языке. Причем без регистрации, которая требуется для загрузки учебника как такового.

Слайды могут быть полезны не только учителям, но и любым интересующимся, кто хочет узнать, как своими руками построить микропроцессор, но не хочет пробиваться через 1600 планшетных страниц книги.

Итого, вырезка из слайдов, чтобы вы поняли, о чем идет речь:
Читать дальше →
Всего голосов 36: ↑33 и ↓3+30
Комментарии13

Виртуальное время, часть 2: вопросы симуляции и виртуализации

Время на прочтение17 мин
Количество просмотров9.8K
В предыдущей статье я рассмотрел существующие в платформе PC источники времени, их особенности, недостатки и историю. Теперь, вооружённые этим знанием, мы можем рассмотреть, как эти устройства могут быть представлены внутри виртуального окружения — полноплатформенного программного симулятора или системной виртуальной машины, т.е. программной среды, позволяющей запускать внутри себя операционную систему.
В этой статье мы разберём различные способы представления времени внутри моделей, подходы к имитации работы таймеров, возможности аппаратного ускорения при виртуализации, а также трудности согласования течения времени внутри моделируемых окружений.



Читать дальше →
Всего голосов 16: ↑15 и ↓1+14
Комментарии0

Что делает центральный процессор, когда ему нечего делать

Время на прочтение10 мин
Количество просмотров73K

Мужик приходит устраиваться работать на стройку. Его спрашивает мастер:
— Что делать умеешь?
— Могу копать…
— А что еще?
— Могу не копать…

Не секрет, что современные процессоры работают очень быстро. Работа их заключается в постоянном извлечении из памяти инструкций и выполнения предписанных в них действий. Однако оказывается, по тем или иным причинам часто требуется притормозить этот процесс. В прикладных программах редко приходится задумываться о том, что при этом происходит с процессором. Но вот для создателей системного софта это далеко не праздный вопрос.


Неактивным процессор может быть не только для экономии энергии, но и в результате возникновения особых ситуаций, в процессе выполнения протоколов инициализации или как итог намеренных действий системных программ. Почему это интересно? При написании программных моделей (в том числе виртуальных машин) компьютерных систем, необходимо корректно моделировать переходы между состояниями виртуальных процессоров. В работе системных программ регулярно возникают ситуации, когда по тем или иным причинам ЦПУ должен «притормозить». Умение корректно использовать и моделировать эти ситуации зависит от знания и понимания спецификаций.


В статье фокус делается на программной стороне вопроса состояний процессора. Я не буду концентрироваться на деталях реализации (напряжения, пины, частоты и т.д.), так как 1) они существенно различаются между поколениями и моделями процессоров даже одной архитектуры, тогда как программный интерфейс остаётся обратно совместимым; 2) они не видны напрямую программам и ОС. Это попытка просуммировать информацию, разбросанную по многим страницам справочника Intel IA-32 and Intel 64 Software Developer Manual.


Начнём с простой и всем знакомой ситуации — процессор включён, бодр и весел.

Читать дальше →
Всего голосов 67: ↑65 и ↓2+63
Комментарии24

Перехват функций .NET/CLR

Время на прочтение16 мин
Количество просмотров20K
Иногда при разработке программного обеспечения требуется встроить дополнительную функциональность в уже существующие приложения без модификации исходного текста приложений. Более того, зачастую сами приложения существуют только в скомпилированном бинарном виде без наличия исходного текста. Широко известным способом решения указанной задачи является т.н. “сплайсинг” – метод перехвата функций путем изменения кода целевой функции. Обычно при сплайсинге первые байты целевой функции перемещаются по другим адресам, а на их исходное место записывается команда безусловного перехода (jmp) на замещающую функцию. Поскольку сплайсинг требует низкоуровневых операций с памятью, то он осуществляется с использованием языка ассемблера и С/C++, что также накладывает определенные ограничения на реализацию замещающих функций – они обычно также реализованы на С/C++ (реже на ассемблере).

Метод сплайсинга для перехвата API-функций в Windows широко описан в Интернете и в различных литературных источниках. Простота указанного перехвата определяется следующими факторами:
  1. целевая функция является статической – она сразу присутствует в памяти загруженного модуля;
  2. адрес целевой функции легко определить (через таблицу экспорта модуля или функцию GetProcAddress).

Реализация замещающих функций на C/C++ при перехвате API-функций является оптимальным вариантом, поскольку Windows API реализовано, как известно, на языке C, и замещающие функции могут оперировать теми же понятиями, что и заменяемые.
Читать дальше →
Всего голосов 48: ↑48 и ↓0+48
Комментарии26

Миллион и один день INotifyPropertyChanged

Время на прочтение2 мин
Количество просмотров12K
Оптимизации пользовательского интерфейса посвящается.

image
Пользовательский интерфейс должен быть быстрым, очень быстрым, невероятно быстрым.

В попытках сэкономить наносекунды зачастую упускаются места где можно экономить секунды. Забавно, однажды на мое возмущение о двух секундной отрисовке небольшого списка, я получил ответ «Дабпиэф ничего не поделаешь», серьезно? Изучая всевозможные варианты реализации INotifyPropertyChanged habrahabr.ru/post/281294 возникает вопрос об идеальном балансе производительности пользовательского интерфейса и разработчика, который занимается этим интерфейсом. Захотелось понять как повлияет на работу интерфейса выбор конкретной реализации.
Читать дальше →
Всего голосов 26: ↑19 и ↓7+12
Комментарии21

C/C++: как измерять процессорное время

Время на прочтение10 мин
Количество просмотров81K

image
КДПВ


От переводчика:
Большинство моих знакомых для измерения времени в разного вида бенчмарках в С++ используют chrono или, в особо запущенных случаях, ctime. Но для бенчмаркинга гораздо полезнее замерять процессорное время. Недавно я наткнулся на статью о кроссплатформенном замере процессорного времени и решил поделиться ею тут, возможно несколько увеличив качество местных бенчмарков.


P.S. Когда в статье написано "сегодня" или "сейчас", имеется ввиду "на момент выхода статьи", то есть, если я не ошибаюсь, март 2012. Ни я, ни автор не гарантируем, что это до сих пор так.
P.P.S. На момент публикации оригинал недоступен, но хранится в кэше Яндекса


Функции API, позволяющие получить процессорное время, использованное процессом, отличаются в разных операционных системах: Windows, Linux, OSX, BSD, Solaris, а также прочих UNIX-подобных ОС. Эта статья предоставляет кросс-платформенную функцию, получающую процессорное время процесса и объясняет, какие функции поддерживает каждая ОС.

Читать дальше →
Всего голосов 32: ↑29 и ↓3+26
Комментарии69

Исследование скорости вызова метода различными способами

Время на прочтение7 мин
Количество просмотров12K

Результат и выводы для тех кто не любит длинный текст



100.000 вызовов, 20 итераций теста, x86 100.000 вызовов, 20 итераций теста, x64 1.000.000 вызовов, 10 итераций теста, x86 1.000.000 вызовов, 10 итераций теста, x64
Прямой вызов
Min:	1 ms
Max:	1 ms
Mean:	1 ms
Median:	1 ms
Abs: 1

Min:	1 ms
Max:	1 ms
Mean:	1 ms
Median:	1 ms
Abs: 1

Min:	7 ms
Max:	8 ms
Mean:	7,5 ms
Median:	7,5 ms
Abs: 1

Min:	5 ms
Max:	6 ms
Mean:	5,2 ms
Median:	5 ms
Abs: 1

Вызов через отражение
Min:	32 ms
Max:	36 ms
Mean:	32,75 ms
Median:	32,5 ms
Rel: 32

Min:	35 ms
Max:	44 ms
Mean:	36,5 ms
Median:	36 ms
Rel: 36

Min:	333 ms
Max:	399 ms
Mean:	345,5 ms
Median:	338 ms
Rel: 45

Min:	362 ms
Max:	385 ms
Mean:	373,6 ms
Median:	376 ms
Rel: 75

Вызов через делегат
Min:	64 ms
Max:	71 ms
Mean:	65,05 ms
Median:	64,5 ms
Rel: 64

Min:	72 ms
Max:	86 ms
Mean:	75,95 ms
Median:	75 ms
Rel: 75

Min:	659 ms
Max:	730 ms
Mean:	688,8 ms
Median:	689,5 ms
Rel: 92

Min:	746 ms
Max:	869 ms
Mean:	773,4 ms
Median:	765 ms
Rel: 153

Вызов через делегат с оптимизациями
Min:	16 ms
Max:	18 ms
Mean:	16,2 ms
Median:	16 ms
Rel: 16

Min:	21 ms
Max:	25 ms
Mean:	22,15 ms
Median:	22 ms
Rel: 22

Min:	168 ms
Max:	187 ms
Mean:	172,8 ms
Median:	170,5 ms
Rel: 22.7

Min:	218 ms
Max:	245 ms
Mean:	228,8 ms
Median:	227 ms
Rel: 45.4

Вызов через dynamic
Min:	11 ms
Max:	14 ms
Mean:	11,5 ms
Median:	11 ms
Rel: 11

Min:	12 ms
Max:	14 ms
Mean:	12,5 ms
Median:	12 ms
Rel: 12

Min:	124 ms
Max:	147 ms
Mean:	132,1 ms
Median:	130 ms
Rel: 17

Min:	127 ms
Max:	144 ms
Mean:	131,5 ms
Median:	129,5 ms
Rel: 26

Вызов через Expression
Min:	4 ms
Max:	4 ms
Mean:	4 ms
Median:	4 ms
Rel: 4

Min:	4 ms
Max:	5 ms
Mean:	4,15 ms
Median:	4 ms
Rel: 4

Min:	46 ms
Max:	55 ms
Mean:	50 ms
Median:	50,5 ms
Rel: 6.7

Min:	47 ms
Max:	51 ms
Mean:	47,7 ms
Median:	47 ms
Rel: 9.4



При использованиии .NET Framework 3.5 лучше всего использовать вызов методов через делегат с оптимизацией вызова. Для .NET Framework 4.0+ отличным выбором будет использование dynamic.
UPD: новый вывод от mayorovp: лучше всего использовать Expression

UPD: и как подсказал CdEmON, такое исследование было опубликовано на хабре ранее

Читать дальше →
Всего голосов 21: ↑15 и ↓6+9
Комментарии12

The dangers of not looking ahead

Время на прочтение3 мин
Количество просмотров23K
На первый взгляд, dynamic в C# — просто object с поддержкой машинерии компилятора. Но не совсем.

Ядром времени выполнения является DLR (Dynamic Language Runtime) — подсистема/фреймворк для поддержки динамических языков программирования. Существует реализация под собственно C#, который идет в поставке с .NET, и отдельная для Iron-языков.

Когда мы работаем с обобщениями (generics), то CLR имеет свои оптимизации на предмет специализации оных. В тот момент, когда CLR+DLR должны работать с generics вместе, поведение написанного кода может стать непредсказуемым.
Читать дальше →
Всего голосов 35: ↑33 и ↓2+31
Комментарии13

Диалоги о Java Performance

Время на прочтение11 мин
Количество просмотров37K
Каждый год на JPoint эксперты выступают с хардкорными докладами о производительности Java. И ни разу не было скучно — вопрос сохраняет актуальность на протяжении многих лет. О том, откуда растут ноги у мифов, что делает JVM, как измерять производительность, при чём тут бизнес-требования заказчика и как обойти часть граблей мы поговорили с экспертами, для которых Java performance — не проблема, а работа.

Читать дальше →
Всего голосов 37: ↑34 и ↓3+31
Комментарии92

Стратегии по ускорению кода на R, часть 1

Время на прочтение3 мин
Количество просмотров7.2K
Цикл for в R может быть очень медленным, если он применяется в чистом виде, без оптимизации, особенно когда приходится иметь дело с большими наборами данных. Есть ряд способов сделать ваш код быстрее, и вы, вероятно, будете удивлены, узнав насколько.

Эта статья описывает несколько подходов, в том числе простые изменения в логике, параллельную обработку и Rcpp, увеличивая скорость на несколько порядков, так что можно будет нормально обрабатывать 100 миллионов строк данных или даже больше.

Давайте попробуем ускорить код с циклом for и условным оператором (if-else) для создания колонки, которая добавляется к набору данных (data frame, df). Код ниже создает этот начальный набор данных.
# Создание набора данных
col1 <- runif (12^5, 0, 2)
col2 <- rnorm (12^5, 0, 2)
col3 <- rpois (12^5, 3)
col4 <- rchisq (12^5, 2)
df <- data.frame (col1, col2, col3, col4)

В этой части: векторизация, только истинные условия, ifelse.
В следующей части: which, apply, побайтовая компиляция, Rcpp, data.table.
Читать дальше →
Всего голосов 16: ↑13 и ↓3+10
Комментарии3

[ В закладки ] Алгоритмы и структуры данных в ядре Linux, Chromium и не только

Время на прочтение9 мин
Количество просмотров86K
Многие студенты, впервые сталкиваясь с описанием какой-нибудь хитроумной штуки, вроде алгоритма Кнута – Морриса – Пратта или красно-чёрных деревьев, тут же задаются вопросами: «К чему такие сложности? И это, кроме авторов учебников, кому-нибудь нужно?». Лучший способ доказать пользу алгоритмов – это примеры из жизни. Причём, в идеале – конкретные примеры применения широко известных алгоритмов в современных, повсеместно используемых, программных продуктах.



Посмотрим, что можно обнаружить в коде ядра Linux, браузера Chromium и ещё в некоторых проектах.
Читать дальше →
Всего голосов 158: ↑149 и ↓9+140
Комментарии15

Обезвреживаем бомбу с Radare2

Время на прочтение12 мин
Количество просмотров61K

Доброго времени суток, %username%! Сегодня мы отправимся изучать бесчисленные возможности фреймворка для реверсера — radare2. В виде подопытного я взял первую попавшую бомбу, она оказалась с сайта Университета Карнеги Меллон.
Читать дальше →
Всего голосов 51: ↑50 и ↓1+49
Комментарии28

Анализ ключевых показателей производительности — часть 1

Время на прочтение7 мин
Количество просмотров34K
Тестирование и анализ производительности — тема, которую хотелось бы обсуждать побольше. Мы начинаем публикацию перевода руководства от небезызвестной команды Patterns&Practices о том, с чем нужно есть ключевые показатели производительности. За перевод — спасибо Игорю Щегловитову из Лаборатории Касперского, нашему бессменному автору материалов про тестирование. Остальные наши статьи по теме тестирования можно найти по тегу mstesting

Введение

Анализ производительности – дисциплина сложная. Она изучает систему на предмет выполнения требований производительности и определяет причины, если эти требования оказываются не достигнутыми. Статья Performance Analysis Primer из этого цикла содержит введение в эту тему, описывая инструменты и подходы, применяемые в облачной разработке для того, чтобы достичь хорошей производительности.
Читать дальше →
Всего голосов 18: ↑18 и ↓0+18
Комментарии0

Титаник на Kaggle: вы не дочитаете этот пост до конца

Время на прочтение31 мин
Количество просмотров82K
Привет, хабр!

#{Data Science для новичков}

Меня зовут Глеб Морозов, мы с Вами уже знакомы по предыдущим статьям. По многочисленным просьбам продолжаю описывать опыт своего участия в образовательных проектах MLClass.ru (кстати, кто еще не успел — до конца еще можно получить материалы прошедших курсов — это, наверное, самый краткий и максимально практичный курс по анализу данных, который можно себе представить).

Данная работа описывает мою попытку создать модель для предсказания выживших пассажиров «Титаника». Основная задача — тренировка в использовании инструментов применяемых в Data Science для анализа данных и презентации результатов исследования, поэтому данная статья будет очень и очень длинной. Основное внимание уделено исследовательскому анализу (exploratory research) и работе по созданию и выбору предикторов (feature engineering). Модель создаётся в рамках соревнования Titanic: Machine Learning from Disaster проходящего на сайте Kaggle. В своей работе я буду использовать язык «R».
Читать дальше →
Всего голосов 42: ↑35 и ↓7+28
Комментарии5

Kaggle: определение тональности текстов

Время на прочтение9 мин
Количество просмотров24K
Привет, хабр!



#{Data Science для новичков}

Меня зовут Глеб Морозов, мы с Вами уже знакомы по предыдущим статьям. По многочисленным просьбам продолжаю описывать опыт своего участия в образовательных проектах MLClass.ru (кстати, кто еще не успел — рекомендую скачать материалы, пока они еще доступны).
Читать дальше →
Всего голосов 23: ↑20 и ↓3+17
Комментарии4

Сравни меня полностью. Рефлексия на службе .NET разработчика

Время на прочтение23 мин
Количество просмотров32K


Недавно передо мной встала следующая задача: необходимо сравнить множество пар объектов. Но есть один нюанс: объекты — самые что ни на есть object'ы, а сравнивать нужно по всему набору публичных свойств. Причём совершенно необязательно, что типы сравниваемых объектов реализуют интерфейс IEquatable<T>.

Было очевидно, что следует использовать рефлексию. Однако при реализации я столкнулся со множеством тонкостей и в конечном счёте прибегнул к чёрной магии динамической генерации IL. В этой статье я хотел бы поделиться опытом и рассказать о том, как я решал эту задачу. Если Вас заинтересовала тема, то прошу под кат!
Читать дальше →
Всего голосов 34: ↑31 и ↓3+28
Комментарии20

Критическое отличие компиляции дерева выражений в Visual Studio 2015

Время на прочтение3 мин
Количество просмотров15K
После перехода на Visual Studio 2015 столкнулся с неприятным и довольно критичным отличием в компиляции одного и того же кода старой версией студии и новой.

Суть его состоит в том, что при генерации дерева выражений Visual Studio 2015 немного по другому генерирует результат, а именно вставляет операнд Convert() для явного приведения типов, которые могут в общем-то приводиться неявно.
Читать дальше →
Всего голосов 17: ↑16 и ↓1+15
Комментарии13

О сколько нам открытий чудных готовит Office Microsoft

Время на прочтение5 мин
Количество просмотров115K


По сообщениям в комментариях к статье про блокнот, во всех версиях Microsoft Excel, начиная по крайней мере с '97 и до самых новых, в имени листа не всегда можно ввести большую букву Ж. Данная проблема обсуждается в сети уже давно, например на этом форуме забавно наблюдать, как некоторые утверждают, что у них проблемы нет, а у других есть, но не всегда, и никто не понимает, почему так. На первый взгляд можно подумать, что это просто недоработка программистов: они хотели не дать пользователю ввести символ ':', и просто не подумали о том, что Ж находится на той же кнопке.

На деле оказалось всё гораздо хуже. Описать нормальными словами то, что происходит в excel, когда вы просто нажимаете кнопку 'Ж', практически невозможно. Поэтому я попытаюсь обрисовать в целом процесс исследования, сократив его где возможно, и не слишком перегружая статью ассемблерным кодом. В итоге мы узнаем, почему получается так, что не любые символы можно ввести, и как это можно исправить.
Читать дальше →
Всего голосов 235: ↑230 и ↓5+225
Комментарии89

TIS-100 — паззл про многопоточный ассемблер, который никто не ждал

Время на прочтение3 мин
Количество просмотров86K
image

Удивительно, но никто не написал ничего про игрушку «TIS-100», которая недавно появилась в Steam (стоит всего 150 рублей, уже 460 положительных отзывов против 6 отрицательных).

Сразу оговорюсь, что к авторам игры я отношения не имею, а вот сама эта игра — отличный инструмент для всех программистов, которые хотят сразиться друг с другом в оптимизации кода на выдуманном хитром ассемблере.

Итак, о чем игра?
Читать дальше →
Всего голосов 45: ↑42 и ↓3+39
Комментарии24

Быстрая и удобная генерация IL

Время на прочтение14 мин
Количество просмотров21K
Я много раз сталкивался с задачей динамической генерации кода (например, при написании эффективного сериализатора или компилятора DSL). Это можно делать разными способами, какой из них лучший – дискуссия для отдельной статьи. По ряду причин я предпочитаю Reflection.Emit и CIL (Common Intermediate Language) и расскажу, с какими проблемами пришлось столкнуться на этом пути, а также об их решении: умной обертке над ILGeneratorGroboIL из библиотеки Graceful Emit.

Хочу отметить при этом, что иногда встречаются ситуации, когда у нас нет большого выбора: например, при написании сериализатора необходимо иметь доступ к приватным полям, и приходится использовать IL. Кстати, известный сериализатор protobuf-net содержит несколько сотен IL-инструкций.

Если вы ни разу не сталкивались с использованием IL-кода, то статья может показаться сложной для понимания, поскольку содержит много примеров кода с использованием IL. Для получения базовых знаний рекомендую прочитать статью Introduction to IL Assembly Language.
Читать дальше →
Всего голосов 28: ↑27 и ↓1+26
Комментарии22

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность