SlideShare a Scribd company logo
Тонкости работы
трассирующего
JIT-компилятора
Антон Солдатов, IPONWEB
Москва, 7 ноября 2017 г.
IPONWEB
● Технологические решения в сфере онлайн-рекламы
● Работаем с нагрузками порядка 5M RPS
● Сложный технологический стек
● Сервер приложений
● Интерпретатор Lua для реализации бизнес-логики
Lua в IPONWEB
● Использовали LuaJIT (1.x, 2.0) более 9 лет
● Q2 2015: Форкнули LuaJIT (Linux, x64)
● 2015-2016: Разработка, стабилизация, первые миграции
● Q1 2017: Мигрировали более 95% серверов
● 2017: Поддержка, работа над новой функциональностью
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
● Завершение корутин по тайм-ауту
Над чем работали (2015 – 2017 гг.)?
● "Проблема гигабайта"
● Новая функция хэширования строк
● Тесты
● Неизменяемые объекты
● Завершение корутин по тайм-ауту
● Профилировщик, новые утилиты
Осень 2016 г.
● Решены самые насущные проблемы
● Первые миграции
● Задача – проанализировать работу JIT-компилятора
● Несколько проектов
● Сервер с выключенным компилятором
● Сервер с включенным компилятором
Анализ производительности JIT-компилятора
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Как работает трассирующий JIT-компилятор?
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Какие были инструменты для анализа?
● Количественно: Graphite, скорость работы системы
● Качественно: luajit -jdump
Какие были инструменты для анализа?
● Количественно: Graphite, скорость работы системы
● Качественно: luajit -jdump
● luajit-web-inspector
● loom
● studio (RaptorJIT)
Что появилось за последний год?
---- TRACE 1 start (command line):1
0006 ADDVV 0 0 4
0007 FORL 1 => 0006
---- TRACE 1 IR
0001 int SLOAD #2 CI
0002 > num SLOAD #1 T
0003 num CONV 0001 num.int
0004 + num ADD 0003 0002
0005 + int ADD 0001 +1
0006 > int LE 0005 +100
0007 ------ LOOP ------------
0008 num CONV 0005 num.int
0009 + num ADD 0008 0004
0010 + int ADD 0005 +1
0011 > int LE 0010 +100
0012 int PHI 0005 0010
0013 num PHI 0004 0009
luajit -jdump
---- TRACE 1 mcode 76
12a0effac mov dword [0x000424a0], 0x1
12a0effb7 cvtsd2si ebp, [rdx+0x8]
12a0effbc cmp dword [rdx+0x4], 0xfffeffff
12a0effc3 jnb 0x12a0e0010 ->0
12a0effc9 xorps xmm7, xmm7
12a0effcc cvtsi2sd xmm7, ebp
12a0effd0 addsd xmm7, [rdx]
12a0effd4 add ebp, +0x01
12a0effd7 cmp ebp, +0x64
12a0effda jg 0x12a0e0014 ->1
->LOOP:
12a0effe0 xorps xmm6, xmm6
12a0effe3 cvtsi2sd xmm6, ebp
12a0effe7 addsd xmm7, xmm6
12a0effeb add ebp, +0x01
12a0effee cmp ebp, +0x64
12a0efff1 jle 0x12a0effe0 ->LOOP
12a0efff3 jmp 0x12a0e001c ->3
---- TRACE 1 stop -> loop
Какова методика анализа?
● Сервер с продуктовой нагрузкой
● Включаем дампер на 10-15 минут
● Анализируем собранные данные
Проблема №0: Инструментарий
src/jit/bc.lua:
local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128)
local a = band(shr(ins, 8), 0xff)
local oidx = 6*band(ins, 0xff)
local op = sub(bcnames, oidx+1, oidx+6)
local s = format("%04d %s %-6s %3s ",
pc, prefix or " ", op, ma == 0 and "" or a)
local d = shr(ins, 16)
if mc == 13*128 then -- BCMjump
return format("%s=> %04dn", s, pc+d-0x7fff)
end
Исходный код
● 700 Мб данных на рабочий поток
● 3500 скомпилированных трасс
● Неудачные попытки компиляции
● Дампы регистров при выходе из трассы
Объем данных
Анализировать вручную невозможно
● Переписали на C
Решение
● Переписали на C
● Написали анализатор (совместим с LuaJIT)
https://github.com/iponweb/dumpanalyze
Решение
● Переписали на C
● Написали анализатор (совместим с LuaJIT)
https://github.com/iponweb/dumpanalyze
● Сгруппированные "кусты" трасс
● Статистика по скомпилированным трассам
● Статистика по неудачным попыткам компиляции
Решение
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Проблема №1: Большое число точек входа
SSP Ромашка
SSP Одуванчик
SSP N
Общая RTB-логика
Архитектура приложения
SSP Ромашка
SSP Одуванчик
SSP N
Общая RTB-логика
Как компилируется?
SSP Ромашка
SSP Одуванчик
SSP N
Общая RTB-логика
Больше двухсот модулей
Завершаем трассирование на выходе из общего модуля
Решение
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Проблема №2: Ключи-литералы в таблицах
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size - 1)
size
Доступ по ключу
local x = t.foo
hash("foo") & (size2 - 1)
size2
Доступ по ключу
Если размер меняется – выходим из трассы
local data = {
{["prop1"] = "value-1", ["prop2"] = 42},
{["prop1"] = "value-2", ["prop2"] = 43},
{["prop1"] = "value-3", ["prop2"] = 44},
{["prop1"] = "value-4", ["prop2"] = 45},
{["prop1"] = "value-5", ["prop2"] = 46},
{["prop1"] = "value-6", ["prop2"] = 47},
{["prop1"] = "value-7", ["prop2"] = 48},
-- ...
}
Поток объектов похожей структуры
● Смартфон
● Приложение
● Геолокация
● Баннер
● Настольный ПК
● Сайт
● Do Not Track
● Видео
● Смартфон
● Сайт
● Do Not Track
● Аудио-ролик
Поток объектов различной структуры
Десятки параметров
Отключаем "быстрое" индексирование
Решение
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Проблема №3: Выход боковых трасс из циклов
for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Компилируемый цикл
for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Компилируемый цикл
for i = 1, N do
foo()
if i > 1000 then
bar()
end
end
baz()
Код вне цикла
Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)
Выводы
● Инструменты общего назначения могут не справляться со
спецификой бизнес-задач.
● Мы стали добавлять опции в компилятор, тестировали,
сравнивали.
● Локальные изменения улучшили производительность на
10%.
● Экосистеме LuaJIT'а нужно помочь с инструментами
аналитики.
Ссылки
О нашей реализации:
● http://bit.ly/iow-hl-2016
● http://bit.ly/iow-lim-2017-03
● http://bit.ly/sdcast-56
Инструменты аналитики:
● http://bit.ly/dumpanalyze
● http://bit.ly/cloudflare-loom
● http://bit.ly/luajit-web-inspector
● http://bit.ly/raptorjit-studio
Вопросы
asoldatov@iponweb.net
https://www.linkedin.com/in/antonsoldatov/

More Related Content

PDF
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
PDF
Tech Talks @NSU: Как приручить дракона: введение в LLVM
PDF
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PPTX
Highload: специализированные высокопроизводительные индексы
PDF
«Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС
PDF
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
PDF
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
PDF
To Go или не to Go
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Tech Talks @NSU: Как приручить дракона: введение в LLVM
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Highload: специализированные высокопроизводительные индексы
«Система защиты от парсинга API 2ГИС» — Дмитрий Бархатов, 2ГИС
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
To Go или не to Go

What's hot (16)

PDF
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
PPTX
PDF
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
PPTX
Михаил Матросов, “С++ без new и delete”
PPTX
Язык программирования PascalABC.NET 2015. Новые возможности
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PDF
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
PDF
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
PPTX
Highload. Создание специализированных высокопроизводительных индексов
PDF
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...
PDF
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
PDF
Haskell
PPTX
OpenACC short review
PDF
Komarov borba za-miesto-urfu_2013
PDF
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
Хранение json-документов в Tarantool / Андрей Дроздов (Mail.ru Group)
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Михаил Матросов, “С++ без new и delete”
Язык программирования PascalABC.NET 2015. Новые возможности
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Как впихнуть утро в сосновом лесу в 4 килобайта. Иван Авдеев. UNIGINE Open Ai...
Highload. Создание специализированных высокопроизводительных индексов
«Карта в браузере: путь от спутникового снимка до пользователя» – Илья Тарату...
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Haskell
OpenACC short review
Komarov borba za-miesto-urfu_2013
«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС
Ad

Similar to Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB) (20)

ODP
Константин Осипов (Mail.Ru)
PDF
Как приручить дракона: введение в LLVM
PDF
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
PDF
MySQL: Есть ли жизнь после 1 млрд. записей.
PDF
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
PPTX
Tarantool, .net, newsql
PDF
Урок 24. Фантомные ошибки
PDF
2014-11-01 02 Иван Зезюля. To go или не to go
PDF
Back to the future: Функциональное программирование вчера и сегодня
PDF
Haskell Lite - presentation for DevDay about Haskell language
PDF
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
PDF
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
PDF
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
PPTX
Функциональное программирование для разработки распределённых, облачных и веб...
PDF
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
PDF
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
PPT
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
PPT
Низкоуровневая Оптимизация (Андрей Аксенов)
PPT
PPTX
20090720 hpc exercise1
Константин Осипов (Mail.Ru)
Как приручить дракона: введение в LLVM
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
MySQL: Есть ли жизнь после 1 млрд. записей.
"Распределенные" вычисления на мобильных платформах. Зачем еще нужен "металли...
Tarantool, .net, newsql
Урок 24. Фантомные ошибки
2014-11-01 02 Иван Зезюля. To go или не to go
Back to the future: Функциональное программирование вчера и сегодня
Haskell Lite - presentation for DevDay about Haskell language
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Функциональное программирование для разработки распределённых, облачных и веб...
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Low-level C/C++ Optimization by Anrew Axenov (Sphinx)
Низкоуровневая Оптимизация (Андрей Аксенов)
20090720 hpc exercise1
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...

Тонкости работы трассирующего JIT-компилятора / Антон Солдатов (IPONWEB)

  • 2. IPONWEB ● Технологические решения в сфере онлайн-рекламы ● Работаем с нагрузками порядка 5M RPS ● Сложный технологический стек ● Сервер приложений ● Интерпретатор Lua для реализации бизнес-логики
  • 3. Lua в IPONWEB ● Использовали LuaJIT (1.x, 2.0) более 9 лет ● Q2 2015: Форкнули LuaJIT (Linux, x64) ● 2015-2016: Разработка, стабилизация, первые миграции ● Q1 2017: Мигрировали более 95% серверов ● 2017: Поддержка, работа над новой функциональностью
  • 4. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта"
  • 5. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк
  • 6. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты
  • 7. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты ● Неизменяемые объекты
  • 8. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты ● Неизменяемые объекты ● Завершение корутин по тайм-ауту
  • 9. Над чем работали (2015 – 2017 гг.)? ● "Проблема гигабайта" ● Новая функция хэширования строк ● Тесты ● Неизменяемые объекты ● Завершение корутин по тайм-ауту ● Профилировщик, новые утилиты
  • 10. Осень 2016 г. ● Решены самые насущные проблемы ● Первые миграции ● Задача – проанализировать работу JIT-компилятора
  • 11. ● Несколько проектов ● Сервер с выключенным компилятором ● Сервер с включенным компилятором Анализ производительности JIT-компилятора
  • 16. Какие были инструменты для анализа? ● Количественно: Graphite, скорость работы системы ● Качественно: luajit -jdump
  • 17. Какие были инструменты для анализа? ● Количественно: Graphite, скорость работы системы ● Качественно: luajit -jdump ● luajit-web-inspector ● loom ● studio (RaptorJIT) Что появилось за последний год?
  • 18. ---- TRACE 1 start (command line):1 0006 ADDVV 0 0 4 0007 FORL 1 => 0006 ---- TRACE 1 IR 0001 int SLOAD #2 CI 0002 > num SLOAD #1 T 0003 num CONV 0001 num.int 0004 + num ADD 0003 0002 0005 + int ADD 0001 +1 0006 > int LE 0005 +100 0007 ------ LOOP ------------ 0008 num CONV 0005 num.int 0009 + num ADD 0008 0004 0010 + int ADD 0005 +1 0011 > int LE 0010 +100 0012 int PHI 0005 0010 0013 num PHI 0004 0009 luajit -jdump ---- TRACE 1 mcode 76 12a0effac mov dword [0x000424a0], 0x1 12a0effb7 cvtsd2si ebp, [rdx+0x8] 12a0effbc cmp dword [rdx+0x4], 0xfffeffff 12a0effc3 jnb 0x12a0e0010 ->0 12a0effc9 xorps xmm7, xmm7 12a0effcc cvtsi2sd xmm7, ebp 12a0effd0 addsd xmm7, [rdx] 12a0effd4 add ebp, +0x01 12a0effd7 cmp ebp, +0x64 12a0effda jg 0x12a0e0014 ->1 ->LOOP: 12a0effe0 xorps xmm6, xmm6 12a0effe3 cvtsi2sd xmm6, ebp 12a0effe7 addsd xmm7, xmm6 12a0effeb add ebp, +0x01 12a0effee cmp ebp, +0x64 12a0efff1 jle 0x12a0effe0 ->LOOP 12a0efff3 jmp 0x12a0e001c ->3 ---- TRACE 1 stop -> loop
  • 19. Какова методика анализа? ● Сервер с продуктовой нагрузкой ● Включаем дампер на 10-15 минут ● Анализируем собранные данные
  • 21. src/jit/bc.lua: local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128) local a = band(shr(ins, 8), 0xff) local oidx = 6*band(ins, 0xff) local op = sub(bcnames, oidx+1, oidx+6) local s = format("%04d %s %-6s %3s ", pc, prefix or " ", op, ma == 0 and "" or a) local d = shr(ins, 16) if mc == 13*128 then -- BCMjump return format("%s=> %04dn", s, pc+d-0x7fff) end Исходный код
  • 22. ● 700 Мб данных на рабочий поток ● 3500 скомпилированных трасс ● Неудачные попытки компиляции ● Дампы регистров при выходе из трассы Объем данных
  • 24. ● Переписали на C Решение
  • 25. ● Переписали на C ● Написали анализатор (совместим с LuaJIT) https://github.com/iponweb/dumpanalyze Решение
  • 26. ● Переписали на C ● Написали анализатор (совместим с LuaJIT) https://github.com/iponweb/dumpanalyze ● Сгруппированные "кусты" трасс ● Статистика по скомпилированным трассам ● Статистика по неудачным попыткам компиляции Решение
  • 32. Проблема №1: Большое число точек входа
  • 33. SSP Ромашка SSP Одуванчик SSP N Общая RTB-логика Архитектура приложения
  • 34. SSP Ромашка SSP Одуванчик SSP N Общая RTB-логика Как компилируется?
  • 35. SSP Ромашка SSP Одуванчик SSP N Общая RTB-логика Больше двухсот модулей
  • 36. Завершаем трассирование на выходе из общего модуля Решение
  • 39. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 40. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 41. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 42. local x = t.foo hash("foo") & (size - 1) size Доступ по ключу
  • 43. local x = t.foo hash("foo") & (size2 - 1) size2 Доступ по ключу
  • 44. Если размер меняется – выходим из трассы
  • 45. local data = { {["prop1"] = "value-1", ["prop2"] = 42}, {["prop1"] = "value-2", ["prop2"] = 43}, {["prop1"] = "value-3", ["prop2"] = 44}, {["prop1"] = "value-4", ["prop2"] = 45}, {["prop1"] = "value-5", ["prop2"] = 46}, {["prop1"] = "value-6", ["prop2"] = 47}, {["prop1"] = "value-7", ["prop2"] = 48}, -- ... } Поток объектов похожей структуры
  • 46. ● Смартфон ● Приложение ● Геолокация ● Баннер ● Настольный ПК ● Сайт ● Do Not Track ● Видео ● Смартфон ● Сайт ● Do Not Track ● Аудио-ролик Поток объектов различной структуры
  • 50. Проблема №3: Выход боковых трасс из циклов
  • 51. for i = 1, N do foo() if i > 1000 then bar() end end baz() Компилируемый цикл
  • 52. for i = 1, N do foo() if i > 1000 then bar() end end baz() Компилируемый цикл
  • 53. for i = 1, N do foo() if i > 1000 then bar() end end baz() Код вне цикла
  • 55. Выводы ● Инструменты общего назначения могут не справляться со спецификой бизнес-задач. ● Мы стали добавлять опции в компилятор, тестировали, сравнивали. ● Локальные изменения улучшили производительность на 10%. ● Экосистеме LuaJIT'а нужно помочь с инструментами аналитики.
  • 56. Ссылки О нашей реализации: ● http://bit.ly/iow-hl-2016 ● http://bit.ly/iow-lim-2017-03 ● http://bit.ly/sdcast-56 Инструменты аналитики: ● http://bit.ly/dumpanalyze ● http://bit.ly/cloudflare-loom ● http://bit.ly/luajit-web-inspector ● http://bit.ly/raptorjit-studio