Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что делает JS-движок, когда я присваиваю переменной тоже значение, что она имеет? (https://javascript.ru/forum/misc/82968-chto-delaet-js-dvizhok-kogda-ya-prisvaivayu-peremennojj-tozhe-znachenie-chto-ona-imeet.html)

Teamur 17.08.2021 21:08

Что делает JS-движок, когда я присваиваю переменной тоже значение, что она имеет?
 
let n=8;
n=8;

Что будет делать JS-движок, перезаписывать то, что не менялось ?

Где найти информацию об алгоритмах оптимизации браузеров при обработке кода?

Или такие вещи лучше проверять в тестах?

Aetae 17.08.2021 22:44

Зависит от движка, очевидно.
Используя логику, варианты:
а) Просто присваивает, тратить зачем-то время ещё и на сравнение нет смысла.
б) Возможно в некоторых случаях предварительно оптимизирует, выкидывая лишнее.

Rise 17.08.2021 23:42

Teamur, алгоритмы пишутся в стандарте.

Aetae 18.08.2021 00:46

Rise, а движки внутри откланяются от стандартов ради скорости.)

voraa 18.08.2021 08:03

Вряд ли всегда производится какие то оптимизации.
V8 работает так
Сначала, при считывании js файла строится AST (абстрактное синтаксическое дерево) - на этом этапе никакой оптимизации нет.
Компиляция в байт-код происходит при первом исполнении кода. Для функций это означает - при первом вызове функции. Т.е это происходит уже во время исполнения. И тратить какое то время на оптимизацию никто не будет.
Оптимизируются только "горячие функции". Они компилируются в ассемблерный код. Там возможна серьезная оптимизация. Что бы функция стала достойна оптимизации она должна быть вызвана большое количество раз (несколько тысяч) и у нее должна быть хорошая статистика (одно из правил - вызовы должны быть всегда с одним и тем же типом аргументов).

Про FF точно не знаю, но вроде там есть промежуточный этап - сначала после большого числа вызовов строится оптимизированный байт-код, а потом если функция продолжает часто вызываться уже ассемблерный код.

Alexandroppolus 18.08.2021 09:00

Цитата:

Сообщение от voraa
Про FF точно не знаю, но вроде там есть промежуточный этап - сначала после большого числа вызовов строится оптимизированный байт-код, а потом если функция продолжает часто вызываться уже ассемблерный код.

недавно такое добавили в V8

voraa 18.08.2021 09:10

Недавно - это когда?
Есть интерпретатор Ignition он строит и выполняет байт-код и собирает статистику.
Есть оптимизирующий компилятор Turbofan - он компилирует в ассемблерный код.
А что оптимизирует байт-код?

До (кажется) 2016г в V8 пытались обходиться без бай-кода. Сначала компилировали в неоптимизированный ассемблерный код, а потом оптимизировали его. Но потом от этого отказались.

Alexandroppolus 18.08.2021 09:22

Цитата:

Сообщение от voraa
Недавно - это когда?

https://habr.com/ru/company/skillfactory/blog/561034/

voraa 18.08.2021 10:03

да. появилось новое, но не совсем тоже, что и в FF.
У FF промежуточный этап - оптимизация байт кода. Из неоптимизированного байт-кода делается оптимизированный байт код.
А sparkplug разворачивает код интерпретатора в ассемблерный код. Т.е каждую инструкцию байткода разворачивают в ассемблерный код, содержащий вызовы всех необходимых внутренних функций для ее выполнения.

Teamur 23.08.2021 11:43

Всем спасибо за ответы !
Придётся создать свой ЯП (уже давно назревало), который будет содержать все мои идеи, а на выходе будет обычный Javascript в связке с WASM и WGSL.
И написан он будет на самом Javascript.

Это будет Титанический Труд и Великое Событие ! )))


Часовой пояс GMT +3, время: 16:51.