Ну, еще один вопрос оптимизации. Я хотел бы знать, действительно ли V8 делает вывод о переменных, а затем оптимизирует обращения на основе этой переменной.
Вывод типа будет примерно таким:
let input = "keyboard";
// ^^^^^ input is String because "keyboard" is String
Существуют ли ситуации, когда V8 не может вывести тип и случайно не оптимизировать его, например, потому что тип определенного выражения можно получить только во время выполнения?
Помещение zxc
в локальные s
let s = ''; // let s : String
s = zxc; // What is zxc?
альтернатива
let s = '';
s = zxc + '';
(Разработчик V8 здесь.) Короткий ответ - "да и нет". Длительный ответ сложный.
Нет прямого "вывода типа для переменных", как в let s = '';
пример - именно потому, что следующим присваиванием может быть s = 1
.
Тем не менее, один из основных принципов того, как современные JavaScript-движки (V8 и другие) генерируют оптимизированный код, - это наблюдать, какие типы были замечены в определенной точке программы. Например, когда у вас есть ... = s + t
, и до сих пор s
и t
всегда были строками, тогда оптимизированный код будет содержать последовательность примерно так:
check if the value in s is a string, otherwise bail out;
check if the value in s is a string, otherwise bail out;
perform a string concatenation of the two values;
где "bail out" означает, что оптимизированный код для всей функции отбрасывается, а выполнение продолжается с неоптимизированным кодом (или байт-кодом), который не делает предположений о типах. Новый оптимизированный код может генерироваться или не создаваться позже, основываясь на обновленной информации о типах. Этот подход не является тем, что обычно называют "типом вывода".
Прямой "вывод типа" в JavaScript возможен только в очень ограниченных обстоятельствах. Например, результат побитовой операции (например, |
, &
, ~
) всегда является 32-битным целым числом; результат унарного плюса (т.е. +foo
) всегда является числом; результат добавления строки ко всему остальному всегда является строкой. Оптимизация компиляторов обычно применяет такие правила для генерации более эффективного кода.
Да, конечно.
Например, с 2012 года V8-теги 32-битные номера, поэтому каждый расчет с "em" намного быстрее. доказательство https://www.html5rocks.com/en/tutorials/speed/v8/#toc-topic-numbers
Коленчатый вал вводит гибридный тип вывода везде, чтобы ускорить каждый доступ к полю без изменений.
Current Ignition делает все больше и лучше и, конечно же, создает собственные коды кода, используя знания типов полей.
И у него есть своя цена за деоптимизацию, когда кто-то пишет значение непредсказуемого типа в известное поле.