Re[18]: JS. Откуда такая разница в скорости?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.06.24 09:12
Оценка:
Здравствуйте, rFLY, Вы писали:

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


C>>Мда, ну и муть.

FLY>Почему же, просто какой-то косяк в движке. Причем связанный с обращением к статическому свойству в конструкторе через имя класса:

Это не косяк, это тот же lookup, что и с поиском в глобальном скопе
Вот смотрите — если вместо class BaseClass написать const BaseClass = class { ... то получится ровно то же, что и у вас
Смотрите сами

без создания объекта
var_:  67.20000000018626
prop: 208.29999999981374
с созданием  объекта
var_:  89.90000000037253
prop: 203.90000000037253


Собственно, если просто заверуть всё в функцию, это ничем не помогает. Все дело именно в том, куда запихивается class BaseClass. Похоже, это какой то конский объект.
А вот объявление класса через const меняет дело

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

    TestMethod()
    {
        return this.Value;
    }

    static Counter = 0;
}
console.log("без создания объекта");
{
    let watch = performance.now();
    
    let sum = 0;
    for (let i = 0; i < 100_000_000; i++)
        sum += i;
    console.log(`var_:  ${performance.now() - watch}`);
}
{
    let watch = performance.now();

    let o = {sum: 0};
    for (let i = 0; i < 100_000_000; i++)
        o.sum += i;
    console.log(`prop: ${performance.now() - watch}`);
}

console.log("с созданием  объекта");
{
    let watch = performance.now();
    
    let sum = 0;
    for (let i = 0; i < 100_000_000; i++) {
        new BaseClass();
        sum += i;
    }
    console.log(`var_:  ${performance.now() - watch}`);
}
{
    let watch = performance.now();

    let o = {sum: 0};
    for (let i = 0; i < 100_000_000; i++) {
        new BaseClass();
        o.sum += i;
    }
    console.log(`prop: ${performance.now() - watch}`);
}
Отредактировано 12.06.2024 9:27 Pauel . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.