Підвищуємо продуктивність коду: спочатку думаємо про даних



Займаючись програмуванням рендеринга графіки, ми живемо у світі, в якому обов'язкові низькорівневі оптимізації, щоб домогтися GPU-фреймів завдовжки 30 мс. Для цього ми використовуємо різні методики і розроблені з нуля нові проходи рендеринга з підвищеною продуктивністю (атрибути геометрії, текстурний кеш, експорт і так далі), GPR-стиск, переховування затримки (latency hiding), ROP…

У сфері підвищення продуктивності CPU свого часу застосовувалися різні трюки, і примітно те, що сьогодні вони використовуються для сучасних відеокарт заради прискорення обчислень ALU (Низькорівнева оптимізація для AMD GCN, Швидкий зворотний квадратний корінь в Quake).


Швидкий зворотний квадратний корінь в Quake

Але останнім часом, особливо в світлі переходу на 64 біта, я помітив зростання кількості неоптимизированного коду, немов в індустрії стрімко втрачаються усі накопичені раніше знання. Так, старі трюки на кшталт швидкого зворотного квадратного кореня на сучасних процесорах контрпродуктивні. Але програмісти не повинні забувати про низькорівневих оптимізацію і сподіватися, що компілятори вирішать всі їх проблеми. Не вирішать.

Ця стаття — не вичерпне хардкорное керівництво по залізу. Це всього лише введення, нагадування, звід базових принципів написання ефективного коду для CPU. Я хочу «показати, що низькорівневе мислення сьогодні все ще корисно», навіть якщо мова піде про процесорах, які я міг би додати.

У статті ми розглянемо кешування, векторне програмування, читання і розуміння асемблерного коду, а також написання коду, зручного для компілятора.

Читати далі →

Оптимізація коду для платформи Ельбрус на простих прикладах

"Зазвичай хакер пише програми не заради вигоди,
а заради власного задоволення. Така програма
може виявитися корисною, а може залишитися
всього лише грою інтелекту."
Генрі С. Уоррен. Алгоритмічні трюки для програмістів [1]

Сьогодні ми продовжимо наші нотатки про Ельбрусі. Першу статтю, присвячену запуску і оптимізації системи розпізнавання паспорта, можна прочитати тут.
image
Одного разу ми з колегами зацікавилися, як найпростіші методи оптимізації працюють на Ельбрусі.
Читати далі →

MemC3 — компактний Memcache з підвищеною паралельністю — за рахунок більш тупого кешування і більш розумного хешування

Це переклад огляду статті «MemC3: Compact and Concurrent MemCache with Dumber Caching and Smarter Hashing» Fan et al. в Proceedings of the 10th USENIX Symposium on Networked Systems Design and Implementation (NSDI'13), pdf тут
Чуваки (колишній гугловец, чувак з університету Карнегі Меллон і ще один із Інтел лабс) зробили покращений Memcached-сумісний кеш (за фактом просто допиляли мемкеш), і у них класні результати продуктивності. Мені дуже сподобався огляд цієї статті в блозі "The morning paper" — опис алгоритмів та інше.

Читати далі →

«Великий зрівнювач» або спосіб вирішити проблему вирівнювання по висоті

Ми багато займаємося електронною комерцією і часто зустрічаємо завдання щодо вирівнювання елементів. На перший погляд все просто, в коді пишеться кілька рядків і все ок. Але насправді елементи бувають дуже різні, правил застосування теж багато, а ще є адаптив.

Ця стаття стане у пригоді тим, хто часто стикається з проблемою вирівнювання елементів по висоті в різних ситуаціях.

Рис. 1. Порядок відображення групи товарів.


Читати далі →

«Великий зрівнювач» або спосіб вирішити проблему вирівнювання по висоті

Ми багато займаємося електронною комерцією і часто зустрічаємо завдання щодо вирівнювання елементів. На перший погляд все просто, в коді пишеться кілька рядків і все ок. Але насправді елементи бувають дуже різні, правил застосування теж багато, а ще є адаптив.

Ця стаття стане у пригоді тим, хто часто стикається з проблемою вирівнювання елементів по висоті в різних ситуаціях.

Рис. 1. Порядок відображення групи товарів.



Читати далі →

Як влаштований парсер Python, і як втричі зменшити споживання ним пам'яті

кожен, хто вивчав пристрій мов програмування, приблизно уявляє, як вони працюють: парсер згідно з формальною граматикою ЯП перетворює вхідний текст в деякий подання, з якою працюють наступні етапи (семантичний аналіз, різні трансформації, і генерація коду).

КДПВ

В Python все трохи складніше: парсерів два. Перший парсер керується граматикою, заданої у файлі
<a href="https://hg.python.org/cpython/file/default/Grammar/Grammar">Grammar/Grammar</a>
у вигляді регулярних виразів (з не зовсім звичайним синтаксисом). По цій граматиці за допомогою
Parser/pgen
під час компіляції
python
генерується цілий набір кінцевих автоматів, розпізнають задані регулярні вирази — по одному КА для кожного нетерминала. Формат получающегося набору КА описаний в
<a href="https://hg.python.org/cpython/file/default/Include/grammar.h">Include/grammar.h</a>
, а самі КА задаються в
<a href="https://hg.python.org/cpython/file/default/Python/graminit.c">Python/graminit.c</a>
, у вигляді глобальної структури
_PyParser_Grammar
. Термінальні символи визначені в
<a href="https://hg.python.org/cpython/file/default/Include/token.h">Include/token.h</a>
, і їм відповідають номери 0..56; номери нетерминалов починаються з 256.

Проілюструвати роботу першого парсера простіше всього на прикладі.
Нехай у нас є програма
if 42: print("Hello world")

Читати далі →

Історія одного дослідження в log4net і прискорення його більш ніж у 10 разів

Почну з того, що дана оптимізація буде працювати тільки, якщо ви використовуєте значення взяті з Properties (наприклад: NDC, MDC) і не використовуєте UserName.
Читати далі →

Всьому свій час

image
Банки.ру — проект з 10-річною історією. В різні часи banki.ru випробовували різні навантаження. Портал перебудовувався під нові вимоги як логічно, так і технологічно, що ми міняли в авральному режимі, щось — еволюційним шляхом. Зараз середня відвідуваність приблизно 2 мільйони перегляду сторінок, тобто проект вже не маленький, але ще й не зовсім великий.
Ця стаття — розшифровка доповіді Романа Ивлиева (CIO Banki.ru) на навчальній конференції HighLoad++ Junior, яка пройшла кілька місяців тому в Москві в рамках фестивалю «Російські інтернет-технології».
У цій статті ми хочемо поговорити про оптимізацію, її своєчасності, і про субоптимизации, про те, що далеко не завжди кращі практики розробки навантажених систем йдуть на користь бізнесу.
Подивимося приклади і пошукаємо відповіді на питання:
  1. Настільки ваш highload — highload?
  2. Вважати хабрэффект приводом для впровадження високих технологій?
  3. «Милиця» або «високотехнологічне рішення» — що вибрати? Плюси і мінуси.
  4. Як вибрати момент для початку нової ери? Є критерії, коли має сенс починати оптимізувати ваш додаток і впроваджувати круті штуки «по-дорослому».
  5. Як можна використати «список Буніна» для досягнення дуже непоганих показників, і всі пункти реально потрібні вам?
  6. Як працювати з технічним боргом, щоб він не заростав мохом?
На закінчення Роман Ивлиев розповість про кілька прикладів з життя banki.ru в частині заміни технологічних рішень в області високих навантажень, і що з цього вийшло.

Читати далі →

Вибираємо кращий онлайн-сервіс по стиснення CSS

стиснення css

В даний час існує величезна кількість веб-інструментів оптимізації CSS файлів. Більшість з них мають власний алгоритм роботи (є, звичайно, і дублікати). Ефективність самих програм теж значно відрізняється. Крім того, деякі оптимізатори можуть «ламати» CSS-код, після чого стилі стають невалидными. Як показує практика, відсоток таких «корисних» інструментів досить високий.

Дана стаття являє собою звіт про проведеному тестуванні найбільш популярних онлайн-оптимізаторів. Експеримент проводився на 3 CSS файли. Посилання на кожен з них наведені в таблиці результатів.

Читати далі →

Розпізнавання паспорта РФ на платформі Ельбрус. Частина 1

У цій статті ми продовжимо розповідати про пригоди нашої програми розпізнавання паспорта: тепер паспорт відправиться на Ельбрус!

Отже, що ж ми знаємо про архітектуру Ельбрус?
Ельбрус — високопродуктивна і енергоефективна архітектура процесорів, що відрізняється високою безпекою і надійністю. Сучасні процесори архітектури Ельбрус можуть застосовуватися в якості серверів, настільних комп'ютерів і навіть вбудованих обчислювачів. Вони здатні задовольнити підвищеним вимогам щодо інформаційної безпеки, робочого діапазону температур і тривалості життєвого циклу продукції. Процесори архітектури Ельбрус, як кажуть нам публікації МЦСТ [1, 2], призначені для вирішення задач обробки сигналів, математичного моделювання, наукових розрахунків, а також інших завдань з підвищеними вимогами до обчислювальної потужності.
Ми в Smart Engines спробували переконатися, чи правда продуктивності Ельбруса достатньо, щоб реалізувати розпізнавання паспорта без значних втрат у швидкості роботи.
Читати далі →