Код практически тот же. Разница в 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}`);
}
надо байт-код посмотреть
Подозреваю что в первом случае компилятор понял что создавать объекты не нужно и можно обойтись инкрементом статического поля.
Добавь третий тест, в котором только инкремент, для проверки теории
А еще может быть что JIT решил метод func откомпилировать, тогда как основной скрипт работал в режиме интерпретатора.
Здравствуйте, vsb, Вы писали:
vsb>Могу предположить, что в первом случае он заинлайнил этот нуль и этот метод. Ну цикл, видимо, не заинлайнил, но уже был близок к этому.
vsb>А потом ты разрушил всю его хрупкую картину мира и он переделал всё "как надо".
Без разницы, в каком порядке их вызывать. Если один закомментировать, тоже без разницы.
Здравствуйте, Muxa, Вы писали:
M>Подозреваю что в первом случае компилятор понял что создавать объекты не нужно и можно обойтись инкрементом статического поля.
M>>Подозреваю что в первом случае компилятор понял что создавать объекты не нужно и можно обойтись инкрементом статического поля. C>Можно как-то этого избежать?
Наверно можно объекты в какой-то массив складывать, а затем один рандомный вывести в консоль.
Здравствуйте, 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}`);
Здравствуйте, 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>
Здравствуйте, 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}`);
}) ();