Lua — высокоуровневый язык, похожий на Python/JS, но существенно более простой. Он гибкий и при этом очень быстрый.
Многие слышали про OpenResty. Это решение для разработки Nginx модулей на Lua. Cloudflare, крупнейший CDN/anti-DDOS провайдер, как раз работает на OpenResty.
У нас была задача валидации данных на соответствие схеме; мы переписали валидацию с Си на Lua и получили ускорение в 4 раза (за счет JIT-компиляции).
Что будет в докладе:
* краткое введение в язык Lua;
* как работает трассирующий JIT-компилятор Lua;
* как писать быстрый код, искать и устранять проблемы с производительностью;
* наш опыт: как мы ускорились в 4 раза, переписав валидацию с Си на Lua.
10. -- closures
function uniqueid (prefix)
local counter = 0
return function ()
counter = counter + 1
return (prefix or "_")..counter
end
end
local u = uniqueid("awesome")
print(u()) -- awesome1
print(u()) -- awesome2
18. JIT-компилятор
• профилирует код на лету
• находит хотспоты
• компилирует горячий код
• холодный код не компилирует
• full-method vs. tracing JIT
19. Что такое “трасса”?
• последовательность байткодов в порядке выполнения
• видны типы переменных
• посещаем одну ветку в if-then-else
• линейная — легко оптимизировать
• если потом типы изменятся?
• если нужна другая ветка в if? — guard
20. Откуда берутся трассы?
• нагретая инcтрукция FORI/LOOP/FUNC* включает
запись трассы
• когда останавливать запись?
• FORI/LOOP/FUNC* заменяем на JFORI/JLOOP/
JFUNC*
• возврат в интерпретатор — по выходу из функции
или по guard
21. Side-трассы
• для guard-ов собирается статистика
• из горячего guard вырастает дочерняя трасса
• JFORI/JLOOP/JFUNC* во время записи?
22.
23.
24. Где спотыкается JIT
• NYI
• сложные ветвления
• равновероятные ветвления в цикле
• циклы с малым числом итераций
• нестабильные типы
• LuaC
26. Takeaway #1
• Lua — современный и высокоуровневый
• легко встраивается
• работает быстро
• any sufficiently complicated C program contains …
an implementation of half of Common Lisp —
Greenspun’s 10th rule
27. Takeaway #2
• LUAJIT: 78 KSLOC / 0.013 секунд на тесте CLBG/M
• V8: 2100 KSLOC / 0.016 секунд
• трассирующий JIT проще в реализации
• у программиста больше забот
• Emscripten для LUAJIT?
28. Takeaway #3
• LUAJIT легко похачить
• идеальный объект для изучения*
sql("SELECT * FROM orders WHERE id = %", id)
35. SAX-подобный формат
ARRAY(3) John Doe Was here
{
"First": "John",
"Last": "Doe"
"Notes": "Was here!"
}
["John", "Doe", "Was here!"]
DICT(3) First John Last Doe Notes Was here
36. ARRAY(3) John Doe Was here
DICT(3) First John Last Doe Notes Was here
CHECK in[0].type == ARRAY
CHECK in[0].length == 3
CHECK in[1].type == STRING
CHECK in[2].type == STRING
CHECK in[3].type == STRING
out[0].type = DICT
out[1].length = 3
out[2] = "First"
out[3] = in[1]
out[4] = "Last"
out[5] = in[2]
out[6] = "Notes"
out[7] = in[3]
39. Final Takeaway
• any sufficiently complicated C program contains …
an implementation of half of Common Lisp —
Greenspun’s 10th rule
• Lua — современный и высокоуровневый
• работает быстро, легко встраивается
40. Ссылки
• http://luajit.org/list.html
• Vyacheslav Egorov: What I learned from LUAJIT
https://youtu.be/EaLboOUG9VQ
• terralang.org
• Андрей Дроздов: Хранение json-документов
в Tarantool
• Дмитрий Стогов: Развитие ветки PHP-7
https://youtu.be/WIcdjJbFuCs
HighLoad, 8 окт. 18:00
HighLoad, 8 окт. 12:00