Здравствуйте, 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;
}
});
Здравствуйте, 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);