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

Динамическая JIT компиляция C++

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров5.2K


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


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


Так, на днях искал материалы про JIT компиляцию C++ в рантайме с помощью clang/llvm и поиск мне выдал мою же собственную статью трехгодичной давности: Динамическая JIT компиляция С/С++ в LLVM с помощью Clang / Хабр. В результате появилась уже эта новая статья про JIT компиляцию C/С++.

Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Комментарии4

В альфа выпуск языка программирования Python 3.13.0a6 встроен JIT-компилятор

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

Опубликован альфа выпуск языка программирования Python 3.13.0a6, в который включена экспериментальная реализация JIT-компилятора, позволяющая добиться существенного повышения производительности. Для активации JIT в CPython добавлена сборочная опция "--enable-experimental-jit". Для работы JIT требуется установка LLVM в качестве дополнительной зависимости.

Читать далее
Всего голосов 10: ↑12 и ↓-2+14
Комментарии9

Команда Edge экспериментирует с отключением JIT

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

Microsoft объявила, что группа по исследованию уязвимостей Edge экспериментирует с новой функцией, получившей название «Super Duper Secure Mode» и предназначенной для улучшения безопасности без значительных потерь производительности.

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

Десять вещей, которые можно делать с GraalVM

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


От переводчика: GraalVM — новая, интересная технология, но на Хабре по ней не так много статей, которые бы могли показать примеры возможностей Graal. Статья ниже — это не просто перечисление того, что GraalVM умеет, но ещё и небольшой мастер-класс, аналогичный тому, который Chris Seaton и Олег Шелаев проводили на Oracle CodeOne 2018. Вслед за автором, призываю — пробуйте делать примеры из статьи, это действительно интересно.


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


  1. Быстрое выполнение Java
  2. Уменьшение времени старта и потребления памяти для Java
  3. Комбинирование JavaScript, Java, Ruby и R
  4. Исполнение программ, написанных на платформо-зависимых языках
  5. Общие инструменты для всех языков программирования
  6. Дополнение JVM приложений
  7. Дополнение платформо-зависимых приложений
  8. Код Java как платформо-зависимая библиотека
  9. Поддержка нескольких языков программирования в базе данных
  10. Создание языков программирования для GraalVM
Читать дальше →
Всего голосов 38: ↑37 и ↓1+36
Комментарии22

Компиляция Python

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

Предположим, вы разработали приложение или библиотеку на Python и уже готовитесь передать его / её  заказчику. И в этот момент появляются разные вопросы.

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

Во-вторых, возникает вопрос окружения - хочется быть уверенным, что заказчик справится с установкой правильной версии Python и всех вспомогательных библиотек, но это не всегда простая задача. Было бы удобно упаковать приложение в автономный исполняемый файл.

И, наконец, хочется,  чтобы конечное приложение работало быстрее, чем в среде разработки.

И вот тут настало время скомпилировать Python-код.

Меня зовут Руслан, я старший разработчик компании «Цифровое проектирование». Сегодня я расскажу, как выбрать тот самый компилятор из множества доступных.

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

Роковой каскад: JIT, и как обновление Postgres привело к 70% отказов на национальном сервисе критической важности

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

Сайт мониторинга ситуации по коронавирусу Соединенного Королевства - основной сервис отчетности во время пандемии COVID-19 для всей страны. Он испытывает нагрузку порядка 45–50 миллионов запросов в день и относится к национальным сервисам критической важности.

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

Есть только одно исключение - наша база данных. Сервис работает с использованием специальной версии PostgreSQL: Hyperscale Citus. Тот факт, что наша база данных не соответствует архитектуре active-active — это не следствие того, что мы не знаем, как делать реплики для чтения, скорее - результат логистических проблем, обсуждение которых выходит за рамки этой статьи.

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

И что же могло пойти не так?
Всего голосов 43: ↑41 и ↓2+39
Комментарии14

Собрать библиотеку hsdis. Насколько глубока кроличья нора?

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

Библиотека hsdis удобна для преобразования листинга машинного кода, создаваемого JIT-компилятором, в читаемый ассемблерный код. Просмотр ассемблерных инструкций может пригодиться для проверки и отладки какого-то критического участка кода, который, например, чувствителен к latency.

В данной статье я пытаюсь описать процесс сборки hsdis для Windows и для Linux, чтобы помочь вам сэкономить время и обойти подводные камни. Я не делал кросс-компиляцию, т.е. не собирал на Windows библиотеку hsdis для Linux. Для сборки hsdis под каждую платформу я использовал "родную" платформу. Может быть шаги, описанные ниже излишне сложны, но именно эти шаги привели меня к результату. Если есть какой-то более короткий путь к цели, пишите в комментариях.

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

Генерация кода во время исполнения или «Пишем свой JIT-компилятор»

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

Современные компиляторы очень хорошо умеют оптимизировать код. Они удаляют никогда не выполняющиеся условные переходы, вычисляют константные выражения, избавляются от бессмысленных арифметических действий (умножение на 1, сложение с 0). Они оперируют данными, известными на момент компиляции.
В момент выполнения информации об обрабатываемых данных гораздо больше. На её основании можно выполнить дополнительные оптимизации и ускорить работу программы.
Оптимизированный для частного случая алгоритм всегда работает быстрее универсального (по крайней мере, не медленнее).
Что если для каждого набора входных данных генерировать оптимальный для обработки этих данных алгоритм?
Очевидно, часть времени выполнения уйдёт на оптимизацию, но если оптимизированный код выполняется часто, затраты окупятся с лихвой.
Как же технически это сделать? Довольно просто — в программу включается мини-компилятор, генерирующий необходимый код. Идея не нова, технология называется “компиляция времени исполнения” или JIT-компиляция. Ключевую роль JIT-компиляция играет в виртуальных машинах и интерпретаторах языков программирования. Часто используемые участки кода (или байт-кода) преобразуются в машинные команды, что позволяет сильно повысить производительность.
Java, Python, C#, JavaScript, Flash ActionScript — неполный (совсем неполный) список языков, в которых это используется. Я предлагаю решить конкретную задачу с использованием этой технологии и посмотреть, что получится.
Читать дальше →
Всего голосов 47: ↑43 и ↓4+39
Комментарии33

Низкоуровневая оптимизация параллельных алгоритмов или SIMD в .NET

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

В настоящее время огромное количество задач требует большой производительности систем. Бесконечно увеличивать количество транзисторов на кристалле процессора не позволяют физические ограничения. Геометрические размеры транзисторов нельзя физически уменьшать, так как при превышении возможно допустимых размеров начинают проявляться явления, которые не заметны при больших размерах активных элементов — начинают сильно сказываться квантовые размерные эффекты. Транзисторы начинают работать не как транзисторы.
А закон Мура здесь ни при чем. Это был и остается законом стоимости, а увеличение количества транзисторов на кристалле — это скорее следствие из закона. Таким образом, для того, чтобы увеличивать мощность компьютерных систем приходится искать другие способы. Это использование мультипроцессоров, мультикомпьютеров. Такой подход характеризуется большим количеством процессорных элементов, что приводит к независимому исполнение подзадач на каждом вычислительном устройстве.
Читать дальше
Всего голосов 32: ↑31 и ↓1+30
Комментарии16

«Как я провёл это лето»: видео с летних встреч JUG.ru

Время на прочтение2 мин
Количество просмотров5.4K
Вот и наступила осень. Кто-то возвращается в город с центнером яблок в багажнике, кто-то — c норвежским пивом прямиком с JavaZone, а мы подготовили для вас материал, который, надеемся, скоротает дождливые вечера. Мы расскажем о трёх летних встречах JUG.ru. Посему разработчики, вернувшись из отпусков, имеют замечательную возможность запастись чашкой горячего чая, завернуться в плед и посмотреть видео с наших митапов.

Итак, летом у нас было три встречи:
    — Douglas Hawkins из Azul рассказал об особенностях работы JIT-компиляторов в HotSpot JVM;
    — Alvaro Hernandez, разработчик ToroDB, рассказал о том, как Java работает с PostgreSQL;
    — наконец, Евгений Борисов порадовал нас новой порцией загадок на тему Spring.

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

Расшифровка доклада: О чём я говорю, когда говорю о тестировании корректности работы компиляторов

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров1.8K

Привет, Хабр! Эта статья о том, как тестируют компиляторы. Она будет интересна разработчикам  и тестировщикам компиляторов, а также всем, кто тестирует сложные технологии. Разберём проблемы тестирования LuaJIT и подходы к решению: неструктурированный фаззинг, синтаксический, семантический, сравнительный фаззинги и тестирование оптимизаций. Статья написана на основе доклада Сергея Бронникова из Tarantool на конференции Highload.

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

Что происходит за кулисами С#: основы работы со стеком

Время на прочтение6 мин
Количество просмотров14K
Предлагаю посмотреть все то, что стоит за простыми строками инициализации объектов, вызова методов и передачи параметров. Ну и, разумеется, использование этих сведений на практике — вычитывание стека вызывающего метода.

Дисклеймер


Прежде, чем приступить к повествованию, настоятельно рекомендую ознакомиться с первым постом про StructLayout, т.к. там разобран пример, который будет использоваться в этой статье.

Весь код, кроющийся за высокоуровневым, представлен для режима отладки, именно он показывают концептуальную основу. Также все изложенное рассмотрено для 32 битной платформы. JIT оптимизации — это отдельная и большая тема, которая здесь рассматриваться не будет.

Также хотелось бы предупредить, что данная статья не содержит материал, который стоит применять в реальных проектах.

Начинаем с теории


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

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

Разбор перформансных задач с JBreak (часть 1)

Время на прочтение35 мин
Количество просмотров12K
Первая часть — разбор самой холиварной задачи из четырёх:

    void forEach(List<Integer> values, PrintStream ps) {
        values.forEach(ps::println);
    }

    void forEach(List<Integer> values, PrintStream ps) {
        values.stream().forEach(ps::println);
    }

    void forEach(List<Integer> values, PrintStream ps) {
        values.parallelStream().forEach(ps::println);
    }

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

Другие публикации серии: Часть 2, Часть 3, Часть 4.
Читать дальше →
Всего голосов 26: ↑25 и ↓1+24
Комментарии10

Разбор перформансных задач с JBreak (часть 3)

Время на прочтение36 мин
Количество просмотров3.9K
Публикую предпоследнюю часть разбора с третьей задачей. До этого выходил разбор первой задачи и второй задачи.

Код к третьей задаче:

    public static double compute(
            double x1, double y1, double z1,
            double x2, double y2, double z2) {
        double x = y1 * z2 - z1 * y2;
        double y = z1 * x2 - x1 * z2;
        double z = x1 * y2 - y1 * x2;
        return x * x + y * y + z * z;
    }

    public static double compute(
            double x1, double y1, double z1,
            double x2, double y2, double z2) {
        Vector v1 = new Vector(x1, y1, z1);
        Vector v2 = new Vector(x2, y2, z2);
        return v1.crossProduct(v2).squared();
    }

    public final static class Vector {
        private final double x, y, z;

        public Vector(double x, double y, double z) {
            this.x = x; this.y = y; this.z = z;
        }

        public double squared() {
            return x * x + y * y + z * z;
        }

        public Vector crossProduct(Vector v) {
            return new Vector(
                    y * v.z - z * v.y,
                    z * v.x - x * v.z,
                    x * v.y - y * v.x);
        }
    }

Условие (упрощённо):
Определить, какие методы быстрые, а какие — медленные (JRE 1.8.0_161).
Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии8

Graal: как использовать новый JIT-компилятор JVM в реальной жизни

Время на прочтение6 мин
Количество просмотров9.7K
На главной сибирской Java-конференции JBreak-2018, проходившей в Новосибирске, Christian Thalinger из Twitter поделился практическим опытом использования Graal. На конференцию компания («Петер-Сервис») отправила всю нашу рабочую группу, и этот доклад мы пришли слушать полным составом. Вполне объяснимо, если учесть тот факт, что Graal по-прежнему считается смелым и потенциально опасным экспериментом (хотя очень похоже, что он войдёт в JDK 10). Было очень интересно узнать, как эта новинка проявляет себя в бою — да не где-нибудь, а в разработке такого уровня.



Кристиан Талингер десяток с лишним лет работает с виртуальными машинами Java, причём ключевой навык в его экспертизе — как раз JIT-компиляторы. Именно Кристиан внедрил Graal и стал инициатором его нынешнего (весьма, по словам Криса, активного) использования в продакшн-среде Twitter. И, если верить Талингеру, это нововведение сохраняет компании приличные деньги за счёт экономии железных ресурсов.
Читать дальше →
Всего голосов 26: ↑24 и ↓2+22
Комментарии6

Разбор перформансных задач с JBreak (часть 4)

Время на прочтение43 мин
Количество просмотров6.9K
Разбор последней четвёртой задачи:

    public double octaPow(double a) {
        return Math.pow(a, 8);
    }

    public double octaPow(double a) {
        return a * a * a * a * a * a * a * a;
    }

    public double octaPow(double a) {
        return Math.pow(Math.pow(Math.pow(a, 2), 2), 2);
    }

    public double octaPow(double a) {
        a *= a; a *= a; return a * a;
    }

Условие (упрощённо):
Определить, какие методы быстрые, а какие — медленные (JRE 1.8.0_161).
Под катом бенчмарки, куски ассемблера и разбор оптимизаций со стороны JVM.

Другие публикации серии: Часть 1, Часть 2 и Часть 3.
Читать дальше →
Всего голосов 34: ↑33 и ↓1+32
Комментарии23

Полный перечень intrinsic-функций в HotSpot в JDK 7, 8, 9 и 10

Время на прочтение45 мин
Количество просмотров11K
Интринсик или intrinsic-функция — функция, которую JIT-компилятор может встроить вместо вызова Java- и JNI-кода с целью оптимизации. Важный вывод из этого — intrinsic-функции не доступны в режиме интерпретатора. По умолчанию в HotSpot используется два JIT-компилятора C1 и C2, таким образом, может быть доступна реализация intrinsic-функции для каждого из JIT-компиляторов. Различия в реализации intrinsic-функций для разных JIT-компиляторов обуславливаются различным внутренним представлением кода (intermediate representation — IR).

В HotSpot реализовано несколько сотен интринсиков (их количество растёт от релиза к релизу). Описание всех intrinsic-функций можно найти в исходниках OpenJDK в файле vmSymbols.hpp. Ниже приведены полные списки интринсиков для JDK 7 (vmSymbols.hpp), JDK 8 (vmSymbols.hpp), JDK 9 (vmSymbols.hpp) и JDK 10 (vmSymbols.hpp).
Читать дальше →
Всего голосов 31: ↑31 и ↓0+31
Комментарии5

Java HotSpot JIT компилятор — устройство, мониторинг и настройка (часть 1)

Время на прочтение8 мин
Количество просмотров31K
JIT (Just-in-Time) компилятор оказывает огромное влияние на быстродействие приложения. Понимание принципов его работы, способов мониторинга и настройки является важным для каждого Java-программиста. В цикле статей из двух частей мы рассмотрим устройство JIT компилятора в HotSpot JVM, способы мониторинга его работы, а также возможности его настройки. В этой, первой части мы рассмотрим устройство JIT компилятора и способы мониторинга его работы.
Читать дальше →
Всего голосов 12: ↑12 и ↓0+12
Комментарии3

Java HotSpot JIT компилятор — устройство, мониторинг и настройка (часть 2)

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

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

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

PHP 8 — Что нового?

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

PHP, начиная с 7 версии, кардинально изменился. Код стал куда быстрее и надёжнее, и писать его стало намного приятнее. Но вот, уже релиз 8 версии! Ноябрь 26, 2020 — примерно на год раньше, чем обещали сами разработчики. И всё же, не смотря на это, мажорная версия получилась особенно удачной. В этой статье я попытаюсь выложить основные приятные изменения, которые мы должны знать.


1. JIT


Как говорят сами разработчики, они выжали максимум производительности в 7 версии (тем самым сделав PHP наиболее шустрым среди динамических ЯПов). Для дальнейшего ускорения, без JIT-компилятора не обойтись. Справедливости ради, стоит сказать, что для веб-приложений использование JIT не сильно улучшает скорость обработки запросов (в некоторых случаях скорость будет даже меньше, чем без него). А вот, где нужно выполнять много математических операций — там прирост скорости очень даже значительный. Например, теперь можно делать такие безумные вещи, как ИИ на PHP.
Включить JIT можно в настройках opcache в файле php.ini.
Подробнее 1 | Подробнее 2 | Подробнее 3


2. Аннотации/Атрибуты (Attributes)


Все мы помним, как раньше на Symfony код писался на языке комментариев. Очень радует, что такое теперь прекратится, и можно будет использовать подсказки любимой IDE, функция "Find usages", и даже рефакторинг!


Забавно, что символ # также можно было использовать для создания комментариев. Так что ничего не меняется в этом мире.
Читать дальше →
Всего голосов 37: ↑34 и ↓3+31
Комментарии58
1