Есть ли оптимизация логического вывода на V8?

1

Ну, еще один вопрос оптимизации. Я хотел бы знать, действительно ли 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 + '';
  • 0
    может быть, это содержит то, что вы ищете? html5rocks.com/en/tutorials/speed/v8
  • 0
    @Shyam Почти ...
Показать ещё 4 комментария
Теги:
v8

2 ответа

1

(Разработчик 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) всегда является числом; результат добавления строки ко всему остальному всегда является строкой. Оптимизация компиляторов обычно применяет такие правила для генерации более эффективного кода.

1

Да, конечно.

Например, с 2012 года V8-теги 32-битные номера, поэтому каждый расчет с "em" намного быстрее. доказательство https://www.html5rocks.com/en/tutorials/speed/v8/#toc-topic-numbers

Коленчатый вал вводит гибридный тип вывода везде, чтобы ускорить каждый доступ к полю без изменений.

Current Ignition делает все больше и лучше и, конечно же, создает собственные коды кода, используя знания типов полей.

И у него есть своя цена за деоптимизацию, когда кто-то пишет значение непредсказуемого типа в известное поле.

  • 0
    К сожалению, пока нет особого отношения к маркировке типов. : /

Ещё вопросы

Сообщество Overcoder
Наверх
Меню