caches считаются? Девиртуализация + inline?
ну видимо везде где может случится bailout откат
В JS это везде. 🤣 При этом inline caches как раз не требуют прям отбрасывать скомпилированную функцию целиком. В то время как девиртуализация позволяет инлайн (не только в JS, но и в Java/C# и даже C++), а инлайн обеспечивает больше 50% ускорения среди вообще всех оптимизаций. Вот и как жить без этого? 😃
ну вообще инлайн кеш это просто информация для спекулятивного оптимизатора который уже решает инлайнить или нет, а если заинлайнил и в процессе работы пришел тип который не был изначально в инлайн кеше то деопт и дальнейшее переоптимизация функции
Inline caches не имеют никакого отношения к code inlining optimisation. 😊
они хранят типы переменных и свойств которые приходят в рантайме и по ним уже можно думать как инлайнить
ну там же вон статья выше про это есть. предполагает что функция использует некоторый конкретный тип и оптимизирует код под него
Это где так? Обычно inline cache — это просто такая vtable, и хранит указатели на функции...
С этим всё понятно. Непонятно, что происходит, если предположение оказалось не верным. 😊
ну я знаю только v8.
Вы, может быть, hidden classes имели в виду?
срабатывает деоптимизация, закономерно
ну вот собственно для каждой переменной собирается о том сколько видов этих скрытых классов случилось. если превысит 4 то индайнить ниче не будет
Т.е. это была спекулятивная оптимизация. А мы опсуждаем тезис, что спекулятивные оптимизации не нужны. Вот у меня в голове это и не сращивается. 😊
это потому что спекуляции деревянные 😁
а чем аргументы выше не подходят. котороые про то что скомпиленные js уже в достаточной степени оптимизированны, что спекуляции не приносят профита, а только накладные расходы
> спекуляции не приносят профита, а только накладные расходы Какие именно из спекуляций? Как я уже писал, inlining приносит более 50% ускорения во всех компиляторах любых языков начиная с C и далее по списку. В ОО языках с виртуальными вызовами для эффективного инлайна нужна ещё девиртуализация — это делается начиная с C++, не говоря уже про JVM/CLR и JS — там в полный рост. Везде кроме C++ это спекулятивная оптимизация, и я не вижу за счёт чего и на каких задачах JS может работать быстрее без неё.
да проблема скорее всего в этих инлайнингах, которые деоптимизируются на каждый чих ну т е элементарно стоит передать вместо {a: 1, b: 2} -> {b: 2, a: 1} произойдется деоптимизиция потому что скрытый класс уже будет другой
пажжи, почему только в плюсах это спекулятивная оптимизация? всё что компиляется, особенно через шланг будет не спекулятивным, не?
ну или там опциональные поля в объектах, там уже это вообще никогда не заоптимизировать
Только в плюсах это НЕ спекулятивная, а консервативная, очевидно, оттого, что AOT, а не JIT.
Обсуждают сегодня