Чтобы понимать, о чём суть, можно ознакомиться с
этой статьёй.
Презентация об оптимизации компилирования JavaScript в V8
Думаю, все знают о том, как управлять качеством компилируемого JavaScript - наверняка это относится не только к V8, но и к FireFox'овским компилятором, которые он меняет через неск. версий (сейчас я про JIT компиляторы).
Вкратце, всё сводится к тому, чтобы как можно более статично писать код - т.е. не использовать разные типы для одной переменной, не добавлять новые свойства к объекту и т.д. ... короче, чтобы получить действительно
быстрый JavaScript, нужно как-то особенно писать.
Тут то и возникает проблема. Вот вроде бы ты и написал, как "надо". Как теперь проверить, деоптимизируется ли функция? Вариант с бенчмарками отпадает, как самый примитивный.
Я немного пощупал V8 (точнее, Chrome, ну да ладно) на предмет логирования его действий при обработке моего скрипта.
Всё свелось к простейшему созданию особого ярлыка для Chrome, и перетаскиванию HTML-файла со скриптом на этот ярлык
(я пока на виндовсе ) :
Код:
|
C:\Users\LOL\AppData\Local\Google\Chrome\Application\chrome.exe --no-sandbox
--js-flags="--logfile=%t.log --trace-opt --trace-deopt --noprof-lazy --prof-auto --log-gc"
--incognito |
Все эти флаги были бережно нагуглены:
Profiling Chromium With V8
Profiling Chromium With V8 №2
после этого в папке с
chrome.dll появился файл лога, содержащий какие-то записи сумашедшего летописца.
Вроде я указал, что мне нужно записывать , но поиск по файлу ничего путёвого, кроме какого-то левого профилирования, не выдал.
Лог сам весит
211 кб Первое упоминание о моём файле аж на
656'й строке.
Код:
|
code-creation,Function,0x369363a0,7992," file:///E:/Max/melanim/dist/mel-anim.compiled.js:5",0x26828704,~
code-creation,Script,0x369382e0,208,"file:///E:/Max/melanim/dist/mel-anim.compiled.js",0x268287a8,~ |
Наверное, это начало разбора главного большого замыкания... интересно, что означают эти записи ?
ещё немного бреда :
Код:
|
code-creation,LoadIC,0x3693d660,98,"prefix"
code-creation,LoadIC,0x3693d660,98,"prefix"
code-creation,LoadIC,0x3693d6e0,98,"lowPrefix"
code-creation,LoadIC,0x3693d6e0,98,"lowPrefix"
code-creation,KeyedLoadIC,0x3693d760,110,"animation"
code-creation,KeyedLoadIC,0x3693d760,110,"animation |
Что такое
LoadIC? А
KeyedLoadIC?
особенно интересны эти моменты :
Код:
|
code-creation,LazyCompile,0x36955160,232,"type.array file:///E:/Max/melanim/dist/mel-anim.compiled.js:73",0x268269a4,~
code-creation,LazyCompile,0x36955260,544,"type.array file:///E:/Max/melanim/dist/mel-anim.compiled.js:73",0x268269a4,* |
Что означают разные символы на концах строк (
~ и
*)? что такое
LazyCompile?
Короче, куча вопросов, и ответов нет. Попытки гугления при водят только к непонятной документации.
Я хотел найти deopt'ы. Где они ?) Кто-нибудь вообще занимался этим?