Re[21]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 12.06.24 22:23
Оценка:
Здравствуйте, Codealot, Вы писали:

Хотя похоже, что без разницы, какой из вариантов используется. Второй всегда тормозит.
Ад пуст, все бесы здесь.
Re[22]: JS. Откуда такая разница в скорости?
От: rFLY  
Дата: 13.06.24 01:11
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Здравствуйте, Codealot, Вы писали:


C>Хотя похоже, что без разницы, какой из вариантов используется. Второй всегда тормозит.

У тебя ошибка — внешний obj не используется, вместо него внутри цикла ты пишешь значение в только что созданный объект
                let obj = { sum: 0 };

                for (let i = 0; i < ItemsNumber; i++)
                {
                    let obj = new BaseClass();
                    let val = obj.TestMethod();
                    obj.sum += val;
                }

Вот результаты теста по нескольким вариантам

Свойство 'o.sum' и BaseClass с BaseClass.Counter++
342.70000000298023
Переменная 'sum' и BaseClass с BaseClass.Counter++
406.09999999403954

Свойство 'o.sum' и ConstClass с ConstClass.Counter++
179.20000000298023
Переменная 'sum' и ConstClass с ConstClass.Counter++
90

Свойство 'o.sum' и this.constructor.Counter++
183.09999999403954
Переменная 'sum' и this.constructor.Counter++
84.59999999403954

Свойство 'o.sum' и prototype
178.80000001192093
Переменная 'sum' и prototype
84.40000000596046


  сам скрипт тестирования
    const TestsNumber = 1;
    const ItemsNumber = 100_000_000;

    function Test(func) {
        let totalTime = 0;

        for (let i = 0; i < TestsNumber; i++) {
            let watch = performance.now();

            func();

            let curTime = performance.now() - watch;
            totalTime += curTime;
        }

        console.log(totalTime / TestsNumber);
    }
    
    // BaseClass.Counter++
    class BaseClass
    {
        TestMethod() {
            this.Value = BaseClass.Counter++;
            return this.Value;
        }

        static Counter = 0;
    }


    console.log("Свойство 'o.sum' и BaseClass с BaseClass.Counter++");
    Test(function() {
        let o = { sum: 0 };

        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new BaseClass();
            let val = obj.TestMethod();
            o.sum += val;
        }
    });

    console.log("Переменная 'sum' и BaseClass с BaseClass.Counter++");
    BaseClass.Counter = 0;
    Test(function() {
        let sum = 0;
        
        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new BaseClass();
            let val = obj.TestMethod();
            sum += val;
        }
    });
    
    // const class
    const ConstClass = class
    {
        TestMethod() {
            this.Value = ConstClass.Counter++;
            return this.Value;
        }

        static Counter = 0;
    }
    
    console.log("\nСвойство 'o.sum' и ConstClass с ConstClass.Counter++");
    Test(function() {
        let o = { sum: 0 };

        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new ConstClass();
            let val = obj.TestMethod();
            o.sum += val;
        }
    });

    console.log("Переменная 'sum' и ConstClass с ConstClass.Counter++");
    ConstClass.Counter = 0;
    Test(function() {
        let sum = 0;
        
        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new ConstClass();
            let val = obj.TestMethod();
            sum += val;
        }
    });

    // через this.constructor.Counter
    class BaseClass2
    {
        TestMethod() {
            this.Value = this.constructor.Counter++;
            return this.Value;
        }

        static Counter = 0;
    }

    console.log("\nСвойство 'o.sum' и this.constructor.Counter++")
    Test(function() {
        let o = { sum: 0 };

        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new BaseClass2();
            let val = obj.TestMethod();
            o.sum += val;
        }
    });

    console.log("Переменная 'sum' и this.constructor.Counter++")
    BaseClass2.Counter = 0;
    Test(function() {
        let sum = 0;
        
        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new BaseClass2();
            let val = obj.TestMethod();
            sum += val;
        }
    });
    
    // По-старинке
    class ProtoClass
    {
        TestMethod() {
            this.Value = Object.getPrototypeOf(this).Counter++;
            return this.Value;
        }
    }
    ProtoClass.prototype.Counter = 0;

    console.log("\nСвойство 'o.sum' и prototype");
    Test(function() {
        let o = { sum: 0 };

        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new ProtoClass();
            let val = obj.TestMethod();
            o.sum += val;
        }
    });

    console.log("Переменная 'sum' и prototype");
    ProtoClass.prototype.Counter = 0;
    Test(function() {
        let sum = 0;
        
        for (let i = 0; i < ItemsNumber; i++) {
            let obj = new ProtoClass();
            let val = obj.TestMethod();
            sum += val;
        }
    });
Re[23]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 13.06.24 01:56
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>У тебя ошибка — внешний obj не используется, вместо него внутри цикла ты пишешь значение в только что созданный объект


Да, есть такое дело. Но по скорости пофиг:

336.42000000029805
1444.9300000000744

        let func = function()
        {
            let sum = 0;
            
            for (let i = 0; i < ItemsNumber; i++)
            {
                let obj = new BaseClass();
                let val = obj.TestMethod();
                sum += val;
            }
        };

        Test(func);
        Test(func);
Ад пуст, все бесы здесь.
Re[21]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 13.06.24 06:50
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Только в хроме, в фаерфоксе такого эффекта нет.


Фаерфокс у меня вообще ничего не выводит
Re[22]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 13.06.24 17:55
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Фаерфокс у меня вообще ничего не выводит


А в Хроме?
Ад пуст, все бесы здесь.
Re[23]: JS. Откуда такая разница в скорости?
От: rFLY  
Дата: 13.06.24 18:13
Оценка:
Здравствуйте, Codealot, Вы писали:

C>А в Хроме?

Ты проставил TestsNumber = 10 так что Pauel мог и не дождаться, я менял на 1 чтобы посмотреть
Re[24]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 13.06.24 19:33
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>Ты проставил TestsNumber = 10 так что Pauel мог и не дождаться, я менял на 1 чтобы посмотреть


Всего 15-20 секунд, обычный вебсайт часто грузится дольше.
При 1 такого эффекта почему-то нет
Ад пуст, все бесы здесь.
Re[23]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.24 12:05
Оценка:
Здравствуйте, Codealot, Вы писали:

P>>Фаерфокс у меня вообще ничего не выводит


C>А в Хроме?


Нет разницы с тем что вы и rfly здесь показываkb
Re: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.24 12:08
Оценка:
Здравствуйте, Codealot, Вы писали:

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


Если вам интересны всякие такие вещи, вы можете глянуть на so поиском по 'V8 developer here', https://stackoverflow.com/search?q=V8+developer+here

У меня в свое время было пару странностей в перформансе, и на so товарищ из v8 все объяснил.
Re[24]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 18.06.24 14:53
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Нет разницы с тем что вы и rfly здесь показываkb


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

P>>Нет разницы с тем что вы и rfly здесь показываkb


C>Так есть разница между первым и вторым вызовом или нет?


Есть, всё так же как у вас с rfly. Он вам и объяснил, в чем дело.
Re[26]: JS. Откуда такая разница в скорости?
От: Codealot Земля  
Дата: 18.06.24 19:45
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Есть, всё так же как у вас с rfly. Он вам и объяснил, в чем дело.


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

P>>Есть, всё так же как у вас с rfly. Он вам и объяснил, в чем дело.


C>Там еще другой случай.


https://stackoverflow.com/search?q=V8+developer+here
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.