Сообщение от Дзен-трансгуманист
|
Погоди, то есть, если я пишу object.method(), и таких object'ов с общим прототипом (или свойством-функцией) у меня хотя бы две штуки, то эти вызовы обречены пожизненно прозябать в стеке ВМ?
Хочешь сказать, что классы проигрывают процедурщине by design? Что-то не верится. Или я неправильно понял?
|
второе
если не совру: если при инлайне меняется контекст, то функция не может быть заинлайнена.
ещё она не инлайнится при вызове функции через call\apply.
Сообщение от Дзен-трансгуманист
|
Много кода там, где много неоднозначностей и абстракций.
|
Стоило мне отрефакторить функцию, заменив условия и установку значения результирующей переменной на простые return'ы, V8 посчитал, что в ней достаточно кода, чтобы её заинлайнить.
Примеров кода надо найти на просторах винта, так что пока верьте на слово
Сообщение от Дзен-трансгуманист
|
Как правило, это функционал верхнего уровня, но чем глубже - тем проще. Код, работающий с вычислительными примитивами и базовыми состояниями, обычно достаточно прост и вызывается в последнюю очередь, следовательно, его легко заинлайнить. А верхний код имеет много вложенных вызовов, значит его нельзя инлайнить ранее, чем в нем самом не проинлайнено всё что только можно. А учитывая, что функции даже на макушке стека могут иметь несколько версий машинного кода, то сложность полного покрытия инлайнами всего дерева вариантов растет в геометрической прогрессии по направлению к корню стека, и в такой же прогрессии падает математическое ожидание реюзинга каждой отдельной ветки. Слишком большие затраты времени и памяти на маловероятное ускорение. Ну это я навскидку сказал, а могут быть камни преткновения и покруче.
|
кстати, я не узнал, что именно инлайнится - подготовленный машинный код или же байткод.
тут я сам хз . но можно чуть попоже порыться в сорцах V8
так то насчёт производительности инлайна помнится мне, что
оптимизация (компиляция в машинный код) кода функции давало прироста поболее, чем её инлайн.
походу, тут нужны тесты и пруф линки )