JIT
JIT
Just In Time
Ondřej Žára, Seznam.cz
Bojový plán
- Píšeme vlastní interpret JS
- JIT a jeho koncepty
- Ladění V8 v Chrome
Píšeme vlastní interpret JS
Jak naimplementovat JS?
var str = "var x = (a+b)*3;";
var tokens = tokenize(str);
var tree = build_ast(tokens);
process_tree(tree);
Obrázek
Jak naimplementovat JS?
var process_tree = function(tree) {
var node = find_first_node(tree);
process_node(node);
}
var process_node = function(node) {
switch (node.type) {
case "var": ...
case "plus": ...
case "assign": ...
...
}
}
Jak naimplementovat JS?
case "var":
switch (node.varType) {
case "string": ...
case "number": ...
case "function": ...
}
break;
JIT a jeho koncepty
Jak je to s výkonem?
- Typy proměnných se mohou měnit a nelze je předvídat
- Proto není možné vygenerovat nativní kód
- Proto se musí JS "interpretovat", což je pomalé
Jak je to s výkonem?
- Pozorování: typy proměnných se často moc nemění
- Pokud se kód chová "zodpovědně", bylo by možné ho zkompilovat do nativního
- Je to riskantní a pracné
Just In Time Compilation
- Funkce (či smyčky), které se vykonávají hodně, budeme pozorovat
- Pokud se ukáže, že jsou jejich proměnné stabilní, zkompilujeme je do nativního kódu
- Pokud zkompilovaná funkce zhřeší, vrátíme ji zpět do interpretovaného režimu
- Bonus: "Hodné" funkce se hodí i na nesouvisející, ale podstatnou optimalizaci – inlining
JIT: terminologie
- Hot je kód, vykonávaný často
- Stable je funkce, která aspiruje na kompilaci
- Bailout je vrácení do interpretovaného (pomalého) režimu
- Inlining je vložení těla funkce na místo jejího volání
JIT: kdo to umí?
- Chrome 1+
- Firefox 3.5+
- IE 9+
- Opera 11+
- Safari 4+
JIT: jak mu vyjít vstříc?
- Neměnit typy proměnných
- Neměnit počty vlastností v objektech (týká se i this!)
- Neměnit celá a desetinná čísla
- Používat monomorfní volání funkcí (stejné počty a typy parametrů)
- Žádný eval
- Do try-catch volání funkcí, nikoliv přímo kód
Ladění V8 v Chrome
Ladění V8 v Chrome
google-chrome --js-flags="--help"
vypíše soupis flagů
google-chrome --js-flags="--trace"
vypisuje komplet všechna JS volání
google-chrome --js-flags="--trace-opt --trace-deopt --code-comments --trace-gc --trace_inlining"
- Optimalizace a deoptimalizace
- Inlinování
- Volání Garbage Collectoru
Ladění V8 v Chrome: ukázka
- Demostránka
- Malá (do 31 bitů) vs. velká čísla
- Celá vs. desetinná čísla
- eval, try-catch
- Alokace paměti