JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 08.06.24 18:27
Оценка: 6 (1)
Запускаю код в хроме.

4999999950000000
1: 320.7000000476837
4999999950000000
2: 1602.199999988079


Код практически тот же. Разница в 5 раз. Какого хрена?

        class BaseClass
        {
            constructor()
            {
                this.Value = BaseClass.Counter++;
            }

            TestMethod()
            {
                return this.Value;
            }

            static Counter = 0;
        }

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

        {
            var watch = performance.now();

            func();
            
            var time = performance.now() - watch;
            console.log(`1: ${time}`);
        }

        BaseClass.Counter = 0;

        {
            var watch = performance.now();

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

            var time = performance.now() - watch;
            console.log(`1: ${time}`);
        }
Ад пуст, все бесы здесь.
Re: JS. Откуда такая разница в скорости?
От: kov_serg Россия  
Дата: 08.06.24 19:43
Оценка: :)
Здравствуйте, Codealot, Вы писали:

C>Код практически тот же. Разница в 5 раз. Какого хрена?

Очевидно же, не прогрелось

https://www.youtube.com/watch?v=7J7X7aZvMXQ
Re[2]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 08.06.24 19:46
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Очевидно же, не прогрелось


Если поменять порядок, скорость у каждого варианта та же.
Ад пуст, все бесы здесь.
Re[3]: JS. Откуда такая разница в скорости?
От: kov_serg Россия  
Дата: 08.06.24 19:48
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Если поменять порядок, скорость у каждого варианта та же.


А сборщик мусора вы учитываете?
Re[4]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 08.06.24 19:49
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>А сборщик мусора вы учитываете?


А как он может в этом случае на что-то влиять?
Ад пуст, все бесы здесь.
Re: JS. Откуда такая разница в скорости?
От: vsb Казахстан  
Дата: 08.06.24 20:48
Оценка:
Могу предположить, что в первом случае он заинлайнил этот нуль и этот метод. Ну цикл, видимо, не заинлайнил, но уже был близок к этому.

А потом ты разрушил всю его хрупкую картину мира и он переделал всё "как надо".
Re: JS. Откуда такая разница в скорости?
От: Muxa  
Дата: 08.06.24 21:07
Оценка:
надо байт-код посмотреть
Подозреваю что в первом случае компилятор понял что создавать объекты не нужно и можно обойтись инкрементом статического поля.

Добавь третий тест, в котором только инкремент, для проверки теории

А еще может быть что JIT решил метод func откомпилировать, тогда как основной скрипт работал в режиме интерпретатора.
Отредактировано 08.06.2024 21:13 Muxa . Предыдущая версия . Еще …
Отредактировано 08.06.2024 21:12 Muxa . Предыдущая версия .
Отредактировано 08.06.2024 21:11 Muxa . Предыдущая версия .
Отредактировано 08.06.2024 21:08 Muxa . Предыдущая версия .
Re[2]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 08.06.24 21:23
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Могу предположить, что в первом случае он заинлайнил этот нуль и этот метод. Ну цикл, видимо, не заинлайнил, но уже был близок к этому.


vsb>А потом ты разрушил всю его хрупкую картину мира и он переделал всё "как надо".


Без разницы, в каком порядке их вызывать. Если один закомментировать, тоже без разницы.
Ад пуст, все бесы здесь.
Re[2]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 08.06.24 21:28
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Подозреваю что в первом случае компилятор понял что создавать объекты не нужно и можно обойтись инкрементом статического поля.


Можно как-то этого избежать?
Ад пуст, все бесы здесь.
Re[3]: JS. Откуда такая разница в скорости?
От: Muxa  
Дата: 08.06.24 21:45
Оценка:
M>>Подозреваю что в первом случае компилятор понял что создавать объекты не нужно и можно обойтись инкрементом статического поля.
C>Можно как-то этого избежать?

Наверно можно объекты в какой-то массив складывать, а затем один рандомный вывести в консоль.
Re[4]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 08.06.24 22:11
Оценка: 1 (1)
Здравствуйте, Muxa, Вы писали:

M>Наверно можно объекты в какой-то массив складывать, а затем один рандомный вывести в консоль.


Все остальное потеряется на фоне работы с массивом.
Ад пуст, все бесы здесь.
Re[2]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 08.06.24 22:14
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Добавь третий тест, в котором только инкремент, для проверки теории


Дальше еще веселее.
4999999950000000
: 837.3000000119209


            var watch = performance.now();

            var sum = 0;
            for (var i = 0; i < 100_000_000; i++)
            {
                sum += i;
            }
            console.log(sum);

            var time = performance.now() - watch;
            console.log(`: ${time}`);
Ад пуст, все бесы здесь.
Re: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.06.24 07:08
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Запускаю код в хроме.

C>

C>4999999950000000
C>1: 320.7000000476837
C>4999999950000000
C>2: 1602.199999988079


C>Код практически тот же. Разница в 5 раз. Какого хрена?


Подозреваю, второй вариант не инлайнится
Re[3]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.06.24 07:10
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Дальше еще веселее.

C>4999999950000000
C>: 837.3000000119209
C>

C>
C>            var watch = performance.now();

C>            var sum = 0;
C>            for (var i = 0; i < 100_000_000; i++)
C>            {
C>                sum += i;
C>            }
C>            console.log(sum);

C>            var time = performance.now() - watch;
C>            console.log(`: ${time}`);

C>


Посмотрите, как работает интерпретатор и джит
Re: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.06.24 09:08
Оценка: 1 (1)
Здравствуйте, Codealot, Вы писали:

C>Запускаю код в хроме.

C>

C>4999999950000000
C>1: 320.7000000476837
C>4999999950000000
C>2: 1602.199999988079


C>Код практически тот же. Разница в 5 раз. Какого хрена?


Подозреваю. все что в глобальном скопе, вообще полностью исполняется интерпретатором
Отредактировано 09.06.2024 19:35 Pauel . Предыдущая версия .
Re[5]: JS. Откуда такая разница в скорости?
От: Muxa  
Дата: 09.06.24 14:19
Оценка:
M>>Наверно можно объекты в какой-то массив складывать, а затем один рандомный вывести в консоль.

C>Все остальное потеряется на фоне работы с массивом.


Тут мне кажется самое тяжелое это аллакация объекта.
Re[3]: JS. Откуда такая разница в скорости?
От: Muxa  
Дата: 09.06.24 14:22
Оценка:
оставь func с инкрементом статической переменной
Re[2]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 09.06.24 16:22
Оценка:
Здравствуйте, Pauel, Вы писали:

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


Зачем? И как это проверить точно?
Ад пуст, все бесы здесь.
Re[4]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 09.06.24 16:22
Оценка:
Здравствуйте, Muxa, Вы писали:

M>оставь func с инкрементом статической переменной


Тогда 60. То есть, это было не устранение создания объектов.
Ад пуст, все бесы здесь.
Re[3]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.06.24 19:24
Оценка:
Здравствуйте, Codealot, Вы писали:

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


C>Зачем? И как это проверить точно?


Оборачиваете в функцию, и всё, второй блок внезапно ускоряется

Оборачиваем только второй блок
class BaseClass
        {
            constructor()
            {
                this.Value = BaseClass.Counter++;
            }

            TestMethod()
            {
                return this.Value;
            }

            static Counter = 0;
        }

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

        {
            var watch = performance.now();

            func();
            
            var time = performance.now() - watch;
            console.log(`1: ${time}`);
        }

        BaseClass.Counter = 0;

        (function x() {
            var watch = performance.now();

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

            var time = performance.now() - watch;
            console.log(`1: ${time}`);
        }) ();


Оборачиваем всё, тот же эффект
(function x() {class BaseClass
        {
            constructor()
            {
                this.Value = BaseClass.Counter++;
            }

            TestMethod()
            {
                return this.Value;
            }

            static Counter = 0;
        }

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

        {
            var watch = performance.now();

            func();
            
            var time = performance.now() - watch;
            console.log(`1: ${time}`);
        }

        BaseClass.Counter = 0;

        
            var watch = performance.now();

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

            var time = performance.now() - watch;
            console.log(`1: ${time}`);
        }) ();
Отредактировано 09.06.2024 19:26 Pauel . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.