As For JS
3.37K subscribers
144 photos
16 videos
4 files
452 links
As For JavaScript...
Обсуждения — @AsForJsTalks
Download Telegram
Это все еще не все.
Не смотря на то, что тема работы var/let/const для меня закрыта, и теперь за меня будут говорить инженеры v8, я анонсирую новый ахуху кейс при использовании let. Который всех снова поставит на рога.

Я сам его только что случайно открыл. Но я Вам его не покажу, потому, что у вас документов нету.

Все, в том числе и я, как остолопы тестировали издержки связанные с ThrowReferenceErrorIfHole, и никто не додумался посмотреть на то, как этот Hole инициализируется. А там, издержек в два раза больше


Кому нечем заняться - попробуйте угадать где проблема.
Вот код для теста.

function doAdd1( a, b ) {
var theThing = 1;
let theSummator = 0;
function doSum() {
for ( var i = 0; i < 10000; i++ ) {
theSummator += theThing + i;
}
}
doSum();
return theSummator;
}
😁9💔8🤯2😎2😍1
Использование var/let/const в примерах

Когда let/const не создаст никаких проблем с производительностью
let/const не создаст вам никаких проблем при условии, если вы их используется СТРОГО в рамках одного функционального окружения:
function doExampleWhereAllFineWithLet() {
function doCalculateCirlceArea( theRadius ) {
const PI = 3.14;
let thePower = 2;
return PI * theRadius ** thePower;
}
doCalculateCirlceArea( 10 );
}
doExampleWhereAllFineWithLet();

Оба идентификатора( thePI, thePower ), используются только в том функциональном окружении, в котором они заявлены.
Производительность этого кода будет на 100% идентична случаю, если бы мы вместо let/const использовали var.



Когда let/const начнут создавать проблемы с производительностью
Проблемы возникают тогда, когда объявленный идентификатор начнете использовать за пределами того функционального окружения в котором был объявление.
function doExampleWhereWeHaveProblemsWithLet() {
const PI = 3.14;
let thePower = 2;
function doCalculateCirlceArea( theRadius ) {
return PI * theRadius ** thePower;
}
doCalculateCirlceArea( 11 );
}
doExampleWhereWeHaveProblemsWithLet();

Оба идентификатора ( thePI, thePower ) используются в другой функции (функциональное окружение отличается от того, где они были объявлены)
В этом случае Вы получаете дополнительные издержки внтури функции doExampleWhereWeHaveProblemsWithLet
Глубина вложенности не важна.


Решение проблем производительности let/const через var
Решением проблем let/const, для случаев использования идентификаторов в окружениях отличных от тех где этот идентификатор был создан, является замена let/const на var.
function doExampleWhereWeResolveThroughVar() {
var PI = 3.14;
var thePower = 2;
function doCalculateCirlceArea( theRadius ) {
return PI * theRadius ** thePower;
}
doCalculateCirlceArea( 11 );
}
doExampleWhereWeResolveThroughVar();



Одно исключение для var
Замена let на var в случае, если идентификатор декларируется в глобальном окружении, напротив приведет к еще большим издержкам.

То есть код вида:
var PI = 3.14;
var thePower = 2;
function doCalculateCirlceArea( theRadius ) {
return PI * theRadius ** thePower;
}
doCalculateCirlceArea( 7 );



Будет работать медленнее чем:
let PI = 3.14;
let thePower = 2;
function doCalculateCirlceArea( theRadius ) {
return PI * theRadius ** thePower;
}
doCalculateCirlceArea( 8 );


Происходит это потому, что спецификация, для случая глобального окружения и variable statement, обладает своим особым поведением, которое создает дополнительные издержки: подобный идентификатор должен создать Property в Global Object. Что требует дополнительных издержек от Agent-а выполняешь го JS код.
Чего не происходит в случае let/const. Так как для них подобное поведение не определено.

var theVarThing = 1;
console.log( globalThis.theVarThing ); // 1
console.log( theVarThing ); // 1

let theLetThing = 2;
console.log( globalThis.theLetThing ); // undefined
console.log( theLetThing ); // 2
🔥30👍94😍2👀2❤‍🔥1👨‍💻1
Краткое ИГОГО тезисами:

1. Современный V8 вынужден тратить больше ресурсов на исполнения кода для let/const declaration.

2. Возникновение этих издержек СТРОГО связано с использованием идентификаторов, заявленных при помощи let/const в функциональном окружении, которое отличается от того где они используются.

3. Окружение создаваемое Block Statement (Declarative Environment) не создает лишних издержек. Все сказанное касается ТОЛЬКО функционального окружения.

4. let/const declaration не имеет никаких отличий от var в том случае, если заявленный идентификатор используется ТОЛЬКО в том же функциональном окружении где и был объявлен идентификатор.

5. var подобных издержек не имеет. То есть производительность let/const всегда либо равна variable statement либо хуже.

6. Для var существует одно исключение связанное с объявлением идентификаторов в глобальном окружении. Где var покажет худшую в сравнении с let/const производительность.

7. Не забывайте, что function declaration согласно спецификации, выполняет те же шаги что и variable statement. Из чего следует, что если вы используете function declaration в Global Environment - вы создаете ненужную нагрузку на Agent исполняющий ваш код.

8. На текущий момент (начало 2024), let/const медленнее var на 7% +-2;
На конец 2022 года, эта цифра была на уровне 15% +-5

9. Существуют еще дополнительные издержки возникающие на стадии Static Semantics для анализа кода с Let и Const. Все что описано ваше, касается только RunTime Semantics


Дополнительные детали в документе от инженеров V8
🔥37👍5😍2
Про void

Современный V8, игнорирует спецификацию void как таковую.
И преобразовывает любой код с void к такому, который исполняется без него, с полсдещуюей вставкой undefined

Например код
function doThing() {};

void doThing();


На уровне V8, код будет приведен к следующему байт коду:
CallUndefinedReceiver0 r0, [0]
LdaUndefined


Эквивалентом этому коду на языке JavaScript будет:
function doThing() {};

(
doThing()
, undefined
)



Вместо ИГОГО
Современный V8 игнорирует void как самостоятельный оператор, и заменяет его альтернативным взаимозаменяемым кодом.
То есть с точки зрения проивзодительности, в отличии от махровых времен, сейчас никаких дополнительных расходов на использования void нет.
Пишите сколько влезет. V8 за вас заменит его на undefined.
👍25👌5
Попробуйте восстановить код таким образом, чтобы получить тот же результат который Вы видите в на скриншоте.
🔥10🤯5👍1
15-00 По Киеву

Я был в бешенстве от теста на Head Hunter, что заставило меня поковырять их код поглубже.
В результате выше нас только звезды.

Посмотрим до какого разгильдяйства доходят разработчики. И как этим можно воспользоваться в своих целях.

https://www.youtube.com/watch?v=CxD9xy_NmFQ
🤣25🔥7👍3😁1
Не зря я твой дом труба шатал

Мне показали уже три видео от сторонних авторов, которые вопят о производительности var/let/const

Проблема только в том, что обоснование которое приводится в видео, заставляет жопу оволосеть, а потом оволосение шевелиться.

Вот пример видео.
Какие ошибки в тесте автора вы видите?


https://youtu.be/gUi5_WVsPFQ
😁18👀3
Хочу поделиться радостью.

Один из наших соратников, обнаружил проблему в v8 с отслеживанием elements-transition, которую на официалном уровне признали багом и пообещали устранить.

Вославим ВанДама!
🔥79👍8❤‍🔥5🤣3👌2😎2
Повод поломать мозги над тем, почему null єто Primitive Value которое связано с Object у которого нулевая/неопределенная структура.

Вспомните все что Вы слышали - про ошибку из за которой null это Object, прочие рассуждения...
И задайте себе вопрос - какой единственный тип мы можем использовать в случае определения прототипа?
А потом вспомните, что Вы можете передать в
Object.setPrototypeOf( {}, {} ); // Ok
Object.setPrototypeOf( {}, null ); // Ok
Object.setPrototypeOf( {}, undefined ); // throw
Object.setPrototypeOf( {}, 'aaa' ); // throw
// etc...
🔥91👍1