Андрей Мелихов - V8 под капотом

  Рет қаралды 52,445

HolyJS — конференция для JavaScript‑разработчиков

HolyJS — конференция для JavaScript‑разработчиков

Күн бұрын

Пікірлер: 27
@demimurych1
@demimurych1 3 жыл бұрын
58:50 *Кеширование байкода* Андрей ошибается. Кеширование откомпилированного кода существует с 2015 года с версии v8 4.2, в чем можно легко убедиться даже просто посмотрев в папку кеша Google Chrome где подобный байткод выделен в отдельную папку. Причем машинерия отвечающая за критерии подобного кеширование местами настолько странная что ничего кроме удивления не вызывает. Ниже чуть упрощенное описание этого процесса, акутальное на июнь 2021 года, достаточное чтобы знать все необходимое для понимания процесса кеширования байткода в Chrome. На текущий момент существует три разных вида поведения браузера приводящие к кешированию байт кода для случае Google Chrome. При этом для всех трех стратегий должны выполняться следующие условия: 1. *Это должен быть внешний файл. Inline код никогда не кешируется* 2. *Размер файла должен быть не менее 1 килобайта* 3. *Кодировка файла и страницы должна быть UTF8* В случае если кодировка не совпадает кеш байт кода не используется, но при этом может в некоторых случаях создаваться. *Стратегия 1* Самая распространенная модель поведения связана с типичной загрузкой Js файла: использования тега script для подключения файла кода. В рамках этой модели, существует три фазы через которые должен пройти код, чтобы его откомпилированная версия попала в кеш. При первом запросе JS файла, происходят все типичные процессы для запуска кода, при этом откомпилированная версия не сохраняется в кеше. Сохраняется только сам JS файл. В случае если осуществляется повторный запрос этого файла не позднее чем через 72 часа относительно первого запроса, его байт код версия, созданная в момент подключения, сохраняется в кеше. И в свою очередь при третьем запросе, который опять должен произойти не позднее чем через 72 часа, уже загружается и используется ранее сохраненная откомпилированная версия. *При этом следует знать* что современный V8 использует так называемую *ленивую компиляцию кода* которая выглядит следующим образом: на старте компилируется только то, что выполнялось в момент подключения JS файла (на самом деле все чуть сложнее, и откомпилирован может быть и мертвый на старте код, но зависит это все, в первую очередь, именно от того _что_ выполняется и _как_ выполняется при подключении). Весь прочий код файла остается в исходном виде. То есть только эта первая часть откомпилированного кода попадает в кеш. Даже если при последующей работе используется весь код из файла, в кеше будет лежать только его часть созданная на момент подключения JS файла. При этом в случае, если эта стартовая часть имеет какое либо ветвление, зависящее от каких то внешних факторов (то есть в одно время выполняется на старте одно а в другое - другое) то в кеш постоянно будет сохраняться то одна версия то вторая. Для примера, в случае загрузки jQuery версии 1.2 где обьем JS кода в несжатом виде составляет около 100кб, около его половины компилируется на старте и соотвественно попадет в кеш байт кода. *Стратегия 2* Вторая модель поведения связана с использованием Cache API. Если JS код запрашивается и подключается при помощи использования этого API, то все происходит ровно так же как и в стратегии 1, за исключением первой подфазы сохранения JS файла. То есть в случае использования Cache API мы ровно на один шаг ближе к цели. *Стратегия 3* Третья модель поведения связана с фазой Install у Service Workera. В этой фазе, все JS файлы которые присутствуют в списке предварительной загрузки, в отличии от двух предыдущих примеров, гарантировано проходят 100% компиляцию, и соотвественно 100% сохранение в кеш байт кода, в результате чего браузер уже при первом подключении использует 100% откомпилированную версию взятую из кеша байт кода. Исключением является ситуации когда, файл, получивший кеш таким образом, будет подключен как модуль. В этом случае кеш аннулируется и вместо него создается новый с использованием типичных механизмов ленивой компиляции. *Как контролировать/изучать процесс* Наблюдать за всеми этими процессами частично можно в DevTools во вкладке Perfomance фильтруя процессы загрузки по конкретному JS файлу. В подробном описании фазы, обязательно указывается откуда взят файл, в каком виде, и каков обьем байт код кешированной версии если взята она. Наиболее подробный отчет можно получить используя механизм записи трейса работы браузера.
@vladimirserdyuk6795
@vladimirserdyuk6795 3 жыл бұрын
А ты крут!
@locktar-o-dark5664
@locktar-o-dark5664 9 ай бұрын
Пять раз свайпнул, чтобы увидеть инпут для ввода этого сообщения 😅
@Danil27-12
@Danil27-12 4 ай бұрын
Смотрел интервью с автором этого комментария. Вы великолепны!
@saskirakosyan5268
@saskirakosyan5268 2 ай бұрын
now before the interview we have to ask javascript before Murych or after? ))) big Like Murych
@kapitanpoloten4ik668
@kapitanpoloten4ik668 3 жыл бұрын
Как же круто, отличный доклад
@ДмитрийЕрохин-э9в
@ДмитрийЕрохин-э9в 3 жыл бұрын
Мегалайк и мегареспект Андрею!
@Maggistr44
@Maggistr44 6 жыл бұрын
Круто.
@artemeesenin9552
@artemeesenin9552 7 жыл бұрын
А почему некоторые видео здесь (На канале HolyJS) доступны только по ссылке, а некоторые выложены в открытый доступ?
@Влад-и2л
@Влад-и2л 3 жыл бұрын
Ок. До +- 2015 года доехали. Вопрос. Что было дальше. Как же развивался V8 дальше...
@AndriiKuftachov
@AndriiKuftachov 7 жыл бұрын
Большинство вопросов из зала - это капец...
@СимафорСимафорыч
@СимафорСимафорыч 2 жыл бұрын
Почему Андрей на 20:01 говорит что язык асинхронный, если он синхронный?
@AlexanderYukal
@AlexanderYukal 4 жыл бұрын
38:00 Так может стоит признать что в данном ЯП не хватает типизации и не решать эту задачу налету перетягивая ответственость за написание кода на интерпретатор или компилятор?
@bodyatsap1685
@bodyatsap1685 4 жыл бұрын
asm.js
@AlexanderYukal
@AlexanderYukal 4 жыл бұрын
@@bodyatsap1685 Та ну нет же. asm.js => это исполняемый код, а я говорю о среде выполнения, компилятор и интерпретатор.
@DarkIllusoire
@DarkIllusoire 4 жыл бұрын
Еще немного и js превратится в actionscript, который так радостно хоронили
@RedkeiGost
@RedkeiGost 2 жыл бұрын
@@DarkIllusoire а чего тогда хоронили? Да, я никропостер, но вдруг.
@DarkIllusoire
@DarkIllusoire 2 жыл бұрын
@@RedkeiGost это загадка)
@AntonioLopez8888
@AntonioLopez8888 3 жыл бұрын
на обложке он был еще студентом
@IT_psychopath
@IT_psychopath 2 жыл бұрын
js не совсем чисто интерпретируется. функции часто могут за компилироваться и использоваться так. не только функции, но чаще именно они. вообще если движок видит что что-то часто используется, он может это закомпилировать чтоб повысить производительность. и чаще всего это именно функции. как и то что многие говорят что node.js однопоточная. она никогда не была однопоточной! даже в первой версии в ней был многопоток.)))
Игорь Алексеенко - Почему мой сайт тормозит и как это исправить
1:00:30
HolyJS — конференция для JavaScript‑разработчиков
Рет қаралды 14 М.
Антон Сергеев, «Go под капотом»
36:37
Kolesa Group
Рет қаралды 102 М.
Из какого города смотришь? 😃
00:34
МЯТНАЯ ФАНТА
Рет қаралды 2,6 МЛН
Don't underestimate anyone
00:47
奇軒Tricking
Рет қаралды 20 МЛН
How to Fight a Gross Man 😡
00:19
Alan Chikin Chow
Рет қаралды 16 МЛН
Николай Матвиенко - Декомпозиция Main Thread в Node.js для увеличения пропускной способности
48:47
HolyJS — конференция для JavaScript‑разработчиков
Рет қаралды 20 М.
Вячеслав Егоров - Производительность JavaScript через подзорную трубу
37:46
HolyJS — конференция для JavaScript‑разработчиков
Рет қаралды 31 М.
Алексей Иванов - Внутреннее устройство бандла webpack
56:04
HolyJS — конференция для JavaScript‑разработчиков
Рет қаралды 14 М.
Алексей Богачук - Offline Second
57:57
HolyJS — конференция для JavaScript‑разработчиков
Рет қаралды 2 М.
Илья Климов - «Строгий» JavaScript: типы против реальности
53:29
HolyJS — конференция для JavaScript‑разработчиков
Рет қаралды 37 М.