|
17.08.2021, 21:08
|
Профессор
|
|
Регистрация: 08.06.2015
Сообщений: 206
|
|
Что делает JS-движок, когда я присваиваю переменной тоже значение, что она имеет?
let n=8;
n=8;
Что будет делать JS-движок, перезаписывать то, что не менялось ?
Где найти информацию об алгоритмах оптимизации браузеров при обработке кода?
Или такие вещи лучше проверять в тестах?
Последний раз редактировалось Teamur, 17.08.2021 в 21:13.
|
|
17.08.2021, 22:44
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Зависит от движка, очевидно.
Используя логику, варианты:
а) Просто присваивает, тратить зачем-то время ещё и на сравнение нет смысла.
б) Возможно в некоторых случаях предварительно оптимизирует, выкидывая лишнее.
__________________
29375, 35
|
|
17.08.2021, 23:42
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 458
|
|
Teamur, алгоритмы пишутся в стандарте.
|
|
18.08.2021, 00:46
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Rise, а движки внутри откланяются от стандартов ради скорости.)
__________________
29375, 35
|
|
18.08.2021, 08:03
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Вряд ли всегда производится какие то оптимизации.
V8 работает так
Сначала, при считывании js файла строится AST (абстрактное синтаксическое дерево) - на этом этапе никакой оптимизации нет.
Компиляция в байт-код происходит при первом исполнении кода. Для функций это означает - при первом вызове функции. Т.е это происходит уже во время исполнения. И тратить какое то время на оптимизацию никто не будет.
Оптимизируются только "горячие функции". Они компилируются в ассемблерный код. Там возможна серьезная оптимизация. Что бы функция стала достойна оптимизации она должна быть вызвана большое количество раз (несколько тысяч) и у нее должна быть хорошая статистика (одно из правил - вызовы должны быть всегда с одним и тем же типом аргументов).
Про FF точно не знаю, но вроде там есть промежуточный этап - сначала после большого числа вызовов строится оптимизированный байт-код, а потом если функция продолжает часто вызываться уже ассемблерный код.
|
|
18.08.2021, 09:00
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от voraa
|
Про FF точно не знаю, но вроде там есть промежуточный этап - сначала после большого числа вызовов строится оптимизированный байт-код, а потом если функция продолжает часто вызываться уже ассемблерный код.
|
недавно такое добавили в V8
|
|
18.08.2021, 09:10
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Недавно - это когда?
Есть интерпретатор Ignition он строит и выполняет байт-код и собирает статистику.
Есть оптимизирующий компилятор Turbofan - он компилирует в ассемблерный код.
А что оптимизирует байт-код?
До (кажется) 2016г в V8 пытались обходиться без бай-кода. Сначала компилировали в неоптимизированный ассемблерный код, а потом оптимизировали его. Но потом от этого отказались.
|
|
18.08.2021, 09:22
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
|
|
18.08.2021, 10:03
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
да. появилось новое, но не совсем тоже, что и в FF.
У FF промежуточный этап - оптимизация байт кода. Из неоптимизированного байт-кода делается оптимизированный байт код.
А sparkplug разворачивает код интерпретатора в ассемблерный код. Т.е каждую инструкцию байткода разворачивают в ассемблерный код, содержащий вызовы всех необходимых внутренних функций для ее выполнения.
|
|
23.08.2021, 11:43
|
Профессор
|
|
Регистрация: 08.06.2015
Сообщений: 206
|
|
Всем спасибо за ответы !
Придётся создать свой ЯП (уже давно назревало), который будет содержать все мои идеи, а на выходе будет обычный Javascript в связке с WASM и WGSL.
И написан он будет на самом Javascript.
Это будет Титанический Труд и Великое Событие ! )))
Последний раз редактировалось Teamur, 23.08.2021 в 11:47.
|
|
|
|