Re[4]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 09.06.24 19:56
Оценка:
Здравствуйте, Pauel, Вы писали:

Так зачем оно может так работать?
Ад пуст, все бесы здесь.
Re[5]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.06.24 20:15
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Так зачем оно может так работать?


Затем, что джиту нужно время. Много времени.
Глобальный контекст это инициализация в основном, там ничего критичного не бывает как правило
Re[6]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 09.06.24 20:32
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Затем, что джиту нужно время. Много времени.


Если перенести тот же код в функцию, время не будет нужно?
Ад пуст, все бесы здесь.
Re: JS. Откуда - из-за var
От: rFLY  
Дата: 09.06.24 22:08
Оценка:
Здравствуйте, Codealot, Вы писали:

Замени на let и будет даже быстрее

4999999950000000
1: 412.90000009536743
4999999950000000
1: 395.40000009536743


{
            var watch = performance.now();

            let sum = 0;
            for (let i = 0; i < 100_000_000; i++)
            {
                let obj = new BaseClass();
                let val = obj.TestMethod();
                sum += val;
            }
            console.log(sum);

            var time = performance.now() - watch;
            console.log(`1: ${time}`);
        }
Отредактировано 09.06.2024 22:12 rFLY . Предыдущая версия .
Re[2]: JS. Откуда такая разница в скорости?
От: rFLY  
Дата: 09.06.24 22:17
Оценка: 28 (4)
Здравствуйте, Pauel, Вы писали:

P>Подозреваю. все что в глобальном скопе, вообще полностью исполняется интерпретатором

И да и нет. Это из-за того, что переменные объявлены через var. В скопе функции это роли не играет, а вот в глобальном получаются доп расходы. Стоит заменить на let и все встает на свои места.
Re[3]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 10.06.24 01:25
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>И да и нет. Это из-за того, что переменные объявлены через var. В скопе функции это роли не играет, а вот в глобальном получаются доп расходы. Стоит заменить на let и все встает на свои места.


Ну и жесть.
Ад пуст, все бесы здесь.
Re[4]: JS. Откуда такая разница в скорости?
От: rFLY  
Дата: 10.06.24 01:49
Оценка: 6 (1)
Здравствуйте, Codealot, Вы писали:

C>Ну и жесть.

Так работает var. Переменные объявленные через var (если только не объявлены внутри функции) в отличии от объявлений через let и const попадают в глобальный скоп. Можешь поставь точку останова внутри цикла и посмотреть.
Re[5]: JS. Откуда такая разница в скорости?
От: Артём Австралия жж
Дата: 10.06.24 02:08
Оценка:
Здравствуйте, rFLY, Вы писали:

C>>Ну и жесть.

FLY>Так работает var. Переменные объявленные через var (если только не объявлены внутри функции) в отличии от объявлений через let и const попадают в глобальный скоп. Можешь поставь точку останова внутри цикла и посмотреть.

Это офигенный ответ. Вообще, код ТС намекает, что он не из мира JS пришёл- элементарно линтер в проекте заругается на var и даже самому мелодичному танцору непозволит написать тот код.
Re[6]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 10.06.24 02:44
Оценка:
Здравствуйте, Артём, Вы писали:

Аё>Вообще, код ТС намекает, что он не из мира JS пришёл- элементарно линтер в проекте заругается на var и даже самому мелодичному танцору непозволит написать тот код.


Казалось бы, что мешало знатокам сразу понять, в чем загвоздка?
Ад пуст, все бесы здесь.
Re[5]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 10.06.24 02:45
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>Так работает var. Переменные объявленные через var (если только не объявлены внутри функции) в отличии от объявлений через let и const попадают в глобальный скоп. Можешь поставь точку останова внутри цикла и посмотреть.


Осталось только понять, при чем здесь скорость.
Ад пуст, все бесы здесь.
Re[6]: JS. Откуда такая разница в скорости?
От: rFLY  
Дата: 10.06.24 03:26
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Осталось только понять, при чем здесь скорость.

Каждая переменная сохраняется в своем лексическом окружении, которое зависит от блока в котором переменная объявлена. По спецификации это некий объект, где сохраняются переменные и их значения (но реализация зависит от браузера). При обращении к переменной она ищется в локальном ЛО и если не находится, то во внешнем. Если не находится и там, то в еще более внешнем. И так пока не дойдет до глобального или не выдаст ошибку, что переменной не существует.
У тебя 3 блока:
1. for — отсюда начинается поиск используемых в цикле переменных, в том числе и var i
2. {} — блок в котором var sum и for
3. глобальный — здесь заканчивается, а все твои переменные попали в него (из-за использования устаревшего var). И помимо их там еще куча всякого.

Может кто-то поправит, но я вижу это так.
Re[7]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.06.24 12:24
Оценка: :)
Здравствуйте, Codealot, Вы писали:

P>>Затем, что джиту нужно время. Много времени.


C>Если перенести тот же код в функцию, время не будет нужно?


Нужно. Только время старта приложения/страницы никто не отменял. Глобальный скоп проще интерпретатором отработать, нежели ждать пока джит прогреется.
Re[6]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.06.24 12:28
Оценка: :)
Здравствуйте, Codealot, Вы писали:

FLY>>Так работает var. Переменные объявленные через var (если только не объявлены внутри функции) в отличии от объявлений через let и const попадают в глобальный скоп. Можешь поставь точку останова внутри цикла и посмотреть.


C>Осталось только понять, при чем здесь скорость.


для глобального скопа работает только интерпретатор, подозреваю, что так. Это уменьшает время старта приложения/страницы

Как убрать код из глобального скопа — вам показали два варианта
Re[4]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.06.24 12:42
Оценка:
Здравствуйте, Codealot, Вы писали:

FLY>>И да и нет. Это из-за того, что переменные объявлены через var. В скопе функции это роли не играет, а вот в глобальном получаются доп расходы. Стоит заменить на let и все встает на свои места.


C>Ну и жесть.


на SO такие кейсы иногда комментируют разработчики v8
Можете спросить у них, почему оптимизатор/джит не берутся за глобальный скоп
Re[7]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 10.06.24 13:49
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Как убрать код из глобального скопа — вам показали два варианта


Если ты про rFLY, то никакого отношения к джиту это не имеет.
Ад пуст, все бесы здесь.
Re[8]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.06.24 14:20
Оценка:
Здравствуйте, Codealot, Вы писали:

P>>Как убрать код из глобального скопа — вам показали два варианта


C>Если ты про rFLY, то никакого отношения к джиту это не имеет.


Что там точно происходит, вам никто кроме разработчиков V8 не скажет.

проседание производительности может происходить по следующим причинам
1. интерпретация — каждый файл до определенного выполняется интерпретатором, большинство успевает завершиться еще до того, как как рантайм решит джит подключать
2. деоптимизации — в вашем коде я их не наблюдаю
3. отсутствие инлайна — явных проблем с этим не видно
Re[7]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.06.24 14:30
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>3. глобальный — здесь заканчивается, а все твои переменные попали в него (из-за использования устаревшего var). И помимо их там еще куча всякого.


FLY>Может кто-то поправит, но я вижу это так.


Пятикратная разница — как то слишком много для поиска переменной.

Подозреваю, если дело в поиске, то замена на global.x должна дать то же пятикратное отставание
Отредактировано 10.06.2024 14:57 Pauel . Предыдущая версия .
Re[9]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 10.06.24 14:56
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Что там точно происходит, вам никто кроме разработчиков V8 не скажет.


Если замена var на let полностью убирает разницу, то при чем здесь интерпретация?
Ад пуст, все бесы здесь.
Re[10]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.06.24 16:46
Оценка:
Здравствуйте, Codealot, Вы писали:

P>>Что там точно происходит, вам никто кроме разработчиков V8 не скажет.


C>Если замена var на let полностью убирает разницу, то при чем здесь интерпретация?


Проверил, похоже это всё property lookup
globalThis.sum += val
Re[11]: JS. Откуда такая разница в скорости?
От: rFLY  
Дата: 10.06.24 20:29
Оценка: 18 (1)
Здравствуйте, Pauel, Вы писали:

P>Проверил, похоже это всё property lookup

P>
P>globalThis.sum += val
P>


А если локальную переменную заменить на локальный объект (let sum = 0 на let o = {sum: 0})
//let sum = 0;
let o = {sum: 0};
for (let i = 0; i < 100_000_000; i++)
{
    let obj = new BaseClass();
    let val = obj.TestMethod();
    //sum += val;
    o.sum += val;
}

то отработает еще на 120 быстрее (интел, эдж последней версии)

с let sum = 0
4999999950000000
1: 408.7000002861023
4999999950000000
2: 390.7999997138977

против

с let o = {sum: 0};
4999999950000000
1: 409.40000009536743
4999999950000000
2: 271.69999980926514

Отредактировано 10.06.2024 20:33 rFLY . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.