Как стать автором
Обновить

Quadcode Meetup (онлайн). Возможности Heap Table в PostgreSQL

Время на прочтение 1 мин
Количество просмотров 389
Блог компании Quadcode SQL *Data Engineering *

Если вы хотите усилить свои скиллы по работе с базами данных, то подключайтесь к Quadcode Meetup “Возможности Heap Table в PostgreSQL”.

На митапе Data Architect Азат Якупов расскажет, как устроена Heap Table, какие метаданные определяют Heap Table, что такое Table page, OIDS, CTID.

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

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 0

Куча Хаскеля

Время на прочтение 2 мин
Количество просмотров 1.6K
Haskell *
Перевод

Куча Хаскеля — довольно странное место. Она не похожа на кучу в традиционном языке со строгими вычислениями...

… которая представляет из себя кучу мусора из старых добрых простых данных!
Читать дальше →
Всего голосов 62: ↑54 и ↓8 +46
Комментарии 34

Вычисление в куче Хаскеля

Время на прочтение 1 мин
Количество просмотров 1.3K
Haskell *
Перевод
Начало серии Куча Хаскеля

Дух новогодних подарков

Сегодня в статье мы кратко рассмотрим, что происходит, когда вы в куче Хаскеля открываете подарок с духом внутри. Почти во всём, что есть в куче, кроме констант и того, что уже вычислено, сидит дух. Весь вопрос в том, что станет делать дух в подарке.
Читать дальше →
Всего голосов 36: ↑29 и ↓7 +22
Комментарии 13

IO работает с кучей Хаскеля

Время на прочтение 2 мин
Количество просмотров 1.1K
Haskell *
Перевод
Начало серии Куча Хаскеля
В этой статье мы сосредоточимся на вас. Вы всё крутитесь около кучи Хаскеля и норовите открыть подарок. В конце концов, подарки сами по себе не открываются.
Читать дальше →
Всего голосов 32: ↑25 и ↓7 +18
Комментарии 3

Опасности метода finalize

Время на прочтение 3 мин
Количество просмотров 21K
Java *
Во время написания статьи про использование фантомных ссылок, мне потребовалось сослаться на неудобства возникающие при работе с методом finalize. К тому же, считаю, что данный топик будет полезен всем начинающим java разработчикам, а некоторые пункты будет не лишним вспомнить и матерым программистам, ведь использовать метод finalize очень просто, чего не скажешь о поиске последсвий этого. Даже если вы твердо убеждены никогда не использовать метод finalize, это еще не значит, что ваши предыдущие коллеги их не использовали, и вам не надо понимать как они работают.
Читать дальше →
Всего голосов 33: ↑31 и ↓2 +29
Комментарии 19

Как бороться с паузами java приложения, не трогая GC

Время на прочтение 2 мин
Количество просмотров 3.8K
Java *
Сколько раз мне приходилось настраивать GC, чтобы вылечить приложение, у которого время от времени случается приступ, и оно перестает временно выполнять свои функции. Работа, скажу, не самая занимательная и требует хорошего знания матчасти. В данном топике я опишу какие еще есть способы решения данной проблемы.
Читать дальше →
Всего голосов 40: ↑30 и ↓10 +20
Комментарии 29

3 миллиарда записей в Java Map на 16 GB RAM

Время на прочтение 3 мин
Количество просмотров 15K
Java *
Из песочницы
Одним дождливым вечером я размышлял о памяти менеджмент в Java и как эффективно использовать Java коллекции. Я сделал простой эксперимент, сколько записей я могу вставить map с 16 Гб оперативной памяти?
Читать дальше →
Всего голосов 53: ↑24 и ↓29 -5
Комментарии 16

Структуры данных, PHP. Часть вторая

Время на прочтение 11 мин
Количество просмотров 37K
PHP *
Туториал
Перевод
Продолжаю совмещать приятное с полезным и переводить. Сегодня речь зайдет о кучах (heaps) и графах. Как обычно, материал скорее подойдет новичкам — большая часть информации, если не вся, уже где-то так или иначе освещалась.

В конце прошлой статьи затрагивались деревья, поэтому начнем с кучи, поскольку между кучей и деревьями есть общие корни. Затем перейдем к графам и реализуем алгоритм Дейкстры.

UPD: Добавил сравнение производительности
Читать дальше →
Всего голосов 37: ↑29 и ↓8 +21
Комментарии 18

J-сортировка

Время на прочтение 7 мин
Количество просмотров 86K
Программирование *Java *Алгоритмы *

Пирамидальная сортировка (она же сортировка кучей) – классический алгоритм который, пожалуй, должен знать любой программист. Старая добрая «пирамидка» примечательна тем, что в независимости от набора данных у неё одна и та же сложность по времени (причём, очень пристойная) – O(n log n). Лучших и вырожденных случаев для неё нет.

С момента изобретения метода (а в этом году алгоритм празднует свой полувековой юбилей) было немало охочих кардинально оптимизировать процесс накладывания сортирующих куч. Тернарная пирамидальная сортировка, плавная сортировка, сортировка декартовым деревом – вот неполный список инноваций. Перечисленные алгоритмы хотя при тестировании и опережают оригинал по абсолютной скорости кто на 12, а кто и на 25%, в оценке временной сложности всё равно крутятся вокруг O(n log n). При этом данные методы весьма изощрённо реализованы.

Своё видение пирамидальной сортировки предложил и скромный труженик Университета Манитобы Джейсон Моррисон. При этом способ в некоторых случаях по скорости приближается к O(n).

Так ещё метод и прост до безобразия
Всего голосов 57: ↑53 и ↓4 +49
Комментарии 17

Оптимизация быстродействия динамического выделения памяти в многопоточной библиотеке

Время на прочтение 4 мин
Количество просмотров 12K
C++ *Параллельное программирование *Разработка под Windows *
Из песочницы
image

Предисловие


Данная статья выросла из проблемы, которую мне относительно недавно пришлось решить: скорость кода, предназначенного для работы одновременно в нескольких потоках, резко упала после очередного расширения функционала, но только на Windows XP/2003. С помощью Process Explorer я выяснил, что в большинство моментов времени исполняется только 1 поток, остальные находятся в ожидании, причём TID активного потока постоянно меняется. На лицо явная конкуренция за ресурс, и этим ресурсом оказалась куча по умолчанию (default heap). Новый код активно использует динамическое выделение/высвобождение памяти (копирование строк, копирование/модификация STL контейнеров большого размера), что собственно и привело к возникновению данной проблемы.

Немного теории


Как известно, аллокатор по умолчанию (default allocator) для STL контейнеров и std::basic_string (std::allocator) выделяет память из кучи по умолчанию, а операции выделения/высвобождения памяти в ней являются блокирующими (косвенное подтверждение). Исходя из этого, при частых вызовах HeapAlloc/HeapFree мы рискуем намертво заблокировать кучу для других потоков. Собственно это и произошло в моём случае.

Читать дальше →
Всего голосов 22: ↑21 и ↓1 +20
Комментарии 33

Эксперименты с malloc

Время на прочтение 12 мин
Количество просмотров 35K
Блог компании VK C *Разработка под MacOS *
image

Как известно, в современных архитектурах x86(_64) и ARM виртуальная память процесса линейна и непрерывна, ибо, к счастью, прошли времена char near* и int huge*. Виртуальная память поделена на страницы, типичный размер которых 4 KiB, и по умолчанию они не отображены на физическую память (mapping), так что работать с ними не получится. Чтобы посмотреть текущие отображённые интервалы адресов у процесса, в Linux смотрим /proc/<pid>/maps, в OS X vmmap <pid>. У каждого интервала адресов есть три вида защиты: от исполнения, от записи и от чтения. Как видно, самый первый интервал, начинающийся с load address (соответствующий сегменту .text у ELF в Linux, __TEXT у Mach-O в OS X), доступен на чтение и исполнение — очень логично. Ещё можно увидеть, что стек по сути ничем не отличается от других интервалов, и можно быстро вычислить его размер, вычтя из конечного адреса начальный. Отображение страниц выполняется с помощью mmap/munmap, а защита меняется с помощью mprotect. Ещё существуют brk/sbrk, deprecated древние пережитки прошлого, которые изменяют размер одного-единственного интервала «данных» и в современных системах эмулируются mmap’ом.

Все POSIX-реализации malloc так или иначе упираются в перечисленные выше функции. По сравнению с наивным выделением и освобождением страниц, округляя необходимый размер в большую сторону, malloc имеет много преимуществ:

  • оптимально управляет уже выделенной памятью;
  • значительно уменьшает количество обращений к ядру (ведь mmap / sbrk — это syscall);
  • вообще абстрагирует программиста от виртуальной памяти, так что многие пользуются malloc’ом, вообще не подозревая о существовании страниц, таблиц трансляции и т. п.

Довольно теории! Будем щупать malloc на практике. Проведём три эксперимента. Работа будет возможна на POSIX-совместимых операционках, в частности была проверена работа на Linux и на OS X.
Читать дальше →
Всего голосов 59: ↑58 и ↓1 +57
Комментарии 11

Exploit Exercises: Введение в эксплуатацию бинарных уязвимостей на примере Protostar

Время на прочтение 20 мин
Количество просмотров 19K
Информационная безопасность *Реверс-инжиниринг *CTF *
Туториал


Всем доброго времени суток. Продолжаем разбор заданий с сайта Exploit Exercises, и сегодня будут рассмотрены основные типы бинарных уязвимостей. Сами задания доступны по ссылке. На этот раз нам доступны 24 уровня, по следующим направлениям:

  • Network programming
  • Byte order
  • Handling sockets
  • Stack overflows
  • Format strings
  • Heap overflows
Читать дальше →
Всего голосов 20: ↑20 и ↓0 +20
Комментарии 0

Эксперименты с malloc и нейронными сетями

Время на прочтение 7 мин
Количество просмотров 26K
Блог компании VK Python *Системное программирование *Алгоритмы *Машинное обучение *


Больше года назад, когда я работал антиспамщиком в Mail.Ru Group, на меня накатило, и я написал про эксперименты с malloc. В то время я в свое удовольствие помогал проводить семинары по АКОСу на ФИВТе МФТИ, и шла тема про аллокацию памяти. Тема большая и очень интересная, при этом охватывает как низкий уровень ядра, так и вполне себе алгоритмоемкие структуры. Во всех учебниках написано, что одна из основных проблем динамического распределения памяти — это ее непредсказуемость. Как говорится, знал бы прикуп — жил бы в Сочи. Если бы оракул заранее рассказал весь план по которому будет выделяться и освобождаться память, то можно было составить оптимальную стратегию, минимизирующую фрагментацию кучи, пиковое потребление памяти и т.д. Отсюда пошла возня с ручными аллокаторами. В процессе раздумий я натолкнулся на отсутствие инструментов логирования malloc() и free(). Пришлось их написать! Как раз про это была статья (а ещe я изучал macOS). Были запланированы две части, однако жизнь круто повернулась и стало не до malloc(). Итак, пора восстановить справедливость и реализовать обещанное: ударить глубоким обучением по предсказанию работы с кучей.


Внутри:


  • Совершенствуем libtracemalloc, перехватчик malloc().
  • Строим LSTM на Keras — глубокую рекуррентную сеть.
  • Обучаем модель на примере работы реального приложения (vcmi/vcmi — а вы думали, причем здесь Heroes III?).
  • Удивляемся неожиданно хорошим результатам.
  • Фантазируем про практическое применение технологии.
  • Исходники.

Интересно? Добро пожаловать под кат.


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

Особенности использования и тестирования кода С++ на микроконтроллерах

Время на прочтение 11 мин
Количество просмотров 23K
Интернет вещей IT-компании
Так сложилось, что основным языком для работы с микроконтроллерами является C. Многие крупные проекты написаны именно на нем. Но жизнь не стоит на месте. Современные средства разработки уже давно позволяют использовать C++ при разработке ПО для встраиваемых систем. Однако такой подход до сих пор встречается достаточно редко. Не так давно я попробовал использовать С++ при работе над очередным проектом. Об этом опыте я и расскажу в данной статье.

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

Три вида утечек памяти

Время на прочтение 7 мин
Количество просмотров 12K
Блог компании Издательский дом «Питер» Высокая производительность *Python *C++ *Виртуализация *
Перевод
Здравствуйте, коллеги.

Наши долгие поиски неустаревающих бестселлеров по оптимизации кода пока дают лишь первые результаты, но мы готовы вас порадовать, что буквально только что закончен перевод легендарной книги Бена Уотсона "Writing High Performance .NET Code". В магазинах — ориентировочно в апреле, следите за рекламой.

А сегодня предлагаем вам почитать сугубо практическую статью о наиболее насущных видах утечек оперативной памяти, которую написал Нельсон Ильхейдж (Nelson Elhage) из компании Stripe.
Читать дальше →
Всего голосов 19: ↑17 и ↓2 +15
Комментарии 13

Моя ошибка на миллиард долларов

Время на прочтение 9 мин
Количество просмотров 6.5K
Управление проектами *Управление продуктом *
Перевод
В первое время мне часто хотелось сдаться. Снова и снова возникало чувство, что мы всё делаем неправильно. Делать предположения о проблемах людей. Решать проблемы, которые мы придумали. Мы искали решения в темноте. У нас было ясное видение, но исполнение страдало.

Мы знали только то, что хотим заново изобрести рынок аналитики. Нашей первой попыткой стала аналитическая платформа для разработчиков приложений Facebook, потому что в то время у них не было эффективных аналитических систем, им приходилось разрабатывать собственные.

Продукт создавался для разработчиков приложений Facebook — и он им понравился! Только они не могли нам заплатить.

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

Динамическая память в системах жёсткого реального времени

Время на прочтение 6 мин
Количество просмотров 15K
Open source *Системное программирование *Алгоритмы *C *Программирование микроконтроллеров *
🔥 Технотекст 2020

Существует класс приложений реального времени, для которых тяжело предсказать потребности в распределении памяти во время выполнения статически. В этот класс входят, например, встраиваемые реализации стеков некоторых коммуникационных протоколов, где поведение и распределение ресурсов определяется отчасти активностью других агентов в сети. Классический подход в таких случаях заключается в использовании блочных менеджеров памяти, выделяющих фрагменты фиксированного размера (как это сделано, например, в LwIP). Этот подход накладывает нежелательные функциональные и качественные ограничения на реализацию. В этой заметке я предлагаю точку зрения, что традиционные (не блочные) аллокаторы незаслуженно обделены вниманием разработчиков систем реального времени, делюсь соображениями по релевантным вопросам, жалуюсь на жизнь, и предлагаю улучшить положение дел.



(КДПВ – см. аннотацию к диаграмме в конце)

Читать дальше →
Всего голосов 61: ↑60 и ↓1 +59
Комментарии 52

Go: Должен ли я использовать указатель вместо копии моей структуры?

Время на прочтение 4 мин
Количество просмотров 15K
Программирование *Go *
Перевод
image
Иллюстрация, созданная для «A Journey With Go», из оригинального гофера, созданного Рене Френч.

С точки зрения производительности систематическое использование указателей вместо копирования самой структуры для совместного использования структур многим Go разработчикам представляется наилучшим вариантом. Для того чтобы понять влияние использования указателя вместо копии структуры мы рассмотрим два варианта использования.
Читать дальше →
Всего голосов 32: ↑23 и ↓9 +14
Комментарии 27

Языковая механика стеков и указателей

Время на прочтение 10 мин
Количество просмотров 7K
Программирование *Go *
Перевод

Прелюдия


Это первая из четырех статей в серии, которая даст представление о механике и дизайне указателей, стеков, куч, escape analysis и семантики значения/указателя в Go. Этот пост посвящен стекам и указателям.

Оглавление цикла статей:

  1. Language Mechanics On Stacks And Pointers
  2. Language Mechanics On Escape Analysis (перевод)
  3. Language Mechanics On Memory Profiling (перевод)
  4. Design Philosophy On Data And Semantics

Вступление


Не буду лукавить — указатели трудны в понимании. При неправильном использовании указатели могут вызвать неприятные ошибки и даже проблемы с производительностью. Это особенно верно при написании конкурентных или многопоточных программ. Неудивительно, что многие языки пытаются скрыть указатели от программистов. Однако, если вы пишете на Go, вы не сможете избежать указателей. Без четкого понимания указателей вам будет сложно писать чистый, простой и эффективный код.
Читать дальше →
Всего голосов 8: ↑7 и ↓1 +6
Комментарии 7

Языковая механика escape analysis

Время на прочтение 9 мин
Количество просмотров 10K
Программирование *Go *
Перевод

Прелюдия


Это вторая из четырех статей в серии, которая даст представление о механике и дизайне указателей, стеков, куч, escape analysis и семантики значения/указателя в Go. Этот пост посвящен кучам и escape analysis.

Оглавление цикла статей:

  1. Language Mechanics On Stacks And Pointers (перевод)
  2. Language Mechanics On Escape Analysis
  3. Language Mechanics On Memory Profiling (перевод)
  4. Design Philosophy On Data And Semantics

Вступление


В первом посте из этой серии я рассказал основы механики указателя на примере, в котором значение распределяется по стеку между горутинами. Я не показывал вам, что происходит, когда вы разделяете значение в стеке. Чтобы понять это, вам нужно узнать о другой области памяти, где могут находиться значения: о «куче». С этим знанием вы можете начать изучать «escape analysis».
Читать дальше →
Всего голосов 7: ↑6 и ↓1 +5
Комментарии 1
1