Re[13]: JS. Откуда такая разница в скорости?
От: rFLY  
Дата: 11.06.24 09:13
Оценка:
Здравствуйте, Pauel, Вы писали:

P>А есть какое внятное объяснение этому? inline cache включается или что?

Вроде в ноде можно дизассемблировать при помощи следующего флага и посмотреть что там творится.
node --print_opt_code test.js

У меня тут ноды нет, так что посмотреть не могу. Могу лишь предположить, что значение свойства sum записывается в регистр, а после цикла обратно, в то время как при работе с переменной при каждой итерации используется ее адрес. А может и еще что делается.

UPD: Стало интересно и решил поэксперементировать
class BaseClass
{
    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}`);
}

без создания объекта
var_: 58.90000009536743
prop: 200.90000009536743

с созданием объекта
var_: 326.1000003814697
prop: 223.5

То есть на итог влияет new BaseClass(). С ним, даже если объект не используется, суммирование через переменную существенно просаживается.
Отредактировано 11.06.2024 12:20 rFLY . Предыдущая версия . Еще …
Отредактировано 11.06.2024 9:15 rFLY . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.