大型 class 数组(包含许多未使用的方法)是否比较小的 class 数组需要更多的时间来计算?
Does an Array of a large class (with lots of unused methods) take more time to compute than with smaller classes?
我想知道以下事情:
我有一组用于 2d 游戏的“射弹”class。每个 Projectile 的工作方式都有点不同,因此需要不同的方法。我开始意识到“射弹”class 可能会爆炸并采用多达 100-200 种不同的方法。当遍历数组时,大多数射弹都不需要大多数方法,所以我想知道运行时是否会因为需要计算大量 'possible' 方法而变慢。或者,如果内存将使用大型 Classes 以大型阵列爆炸。我正在使用 Javascript 并尝试优化程序,但一般都会询问。
现在,我知道在较小的 class 中继承 Projectile Class 是有意义的(我出于其他原因正在这样做)但问题仍然存在。或者,如果这个问题根本不是问题,那么解决这个问题的最明智的方法是什么?
创建许多 big class 的实例不会增加内存使用量,因为所有方法都附加到实例原型,所以它只有一个原型(保存方法)被多个引用实例。
这里有一个演示:
class BigClass {
method1() {}
method2() {}
method3() {}
// ...
}
const instance1 = new BigClass;
const instance2 = new BigClass;
console.log(Object.getOwnPropertyNames(BigClass.prototype));
console.log(Object.getPrototypeOf(instance1) === BigClass.prototype); // true
console.log(Object.getPrototypeOf(instance1) === Object.getPrototypeOf(instance2)); // true
console.log(instance1.method1 === instance2.method1); // true
当您有构造函数时,属性会附加到实例本身,从而根据实例数量按比例增加内存使用量。
演示:
class SomeClass {
constructor(arg1, arg2, arg3) {
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
}
}
const instance1 = new SomeClass({});
const instance2 = new SomeClass({});
console.log(instance1.arg1 === instance2.arg1); // false
// Note: that is not true when you pass an argument as a reference
const obj = {};
const instance3 = new SomeClass(obj);
const instance4 = new SomeClass(obj);
// In that case, obj is shared between the two instances
console.log(instance3.arg1 === instance4.arg1); // true
instance3.arg1.test = 'value';
console.log(instance4.arg1); // { test: 'value' }
我想知道以下事情:
我有一组用于 2d 游戏的“射弹”class。每个 Projectile 的工作方式都有点不同,因此需要不同的方法。我开始意识到“射弹”class 可能会爆炸并采用多达 100-200 种不同的方法。当遍历数组时,大多数射弹都不需要大多数方法,所以我想知道运行时是否会因为需要计算大量 'possible' 方法而变慢。或者,如果内存将使用大型 Classes 以大型阵列爆炸。我正在使用 Javascript 并尝试优化程序,但一般都会询问。
现在,我知道在较小的 class 中继承 Projectile Class 是有意义的(我出于其他原因正在这样做)但问题仍然存在。或者,如果这个问题根本不是问题,那么解决这个问题的最明智的方法是什么?
创建许多 big class 的实例不会增加内存使用量,因为所有方法都附加到实例原型,所以它只有一个原型(保存方法)被多个引用实例。
这里有一个演示:
class BigClass {
method1() {}
method2() {}
method3() {}
// ...
}
const instance1 = new BigClass;
const instance2 = new BigClass;
console.log(Object.getOwnPropertyNames(BigClass.prototype));
console.log(Object.getPrototypeOf(instance1) === BigClass.prototype); // true
console.log(Object.getPrototypeOf(instance1) === Object.getPrototypeOf(instance2)); // true
console.log(instance1.method1 === instance2.method1); // true
当您有构造函数时,属性会附加到实例本身,从而根据实例数量按比例增加内存使用量。
演示:
class SomeClass {
constructor(arg1, arg2, arg3) {
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
}
}
const instance1 = new SomeClass({});
const instance2 = new SomeClass({});
console.log(instance1.arg1 === instance2.arg1); // false
// Note: that is not true when you pass an argument as a reference
const obj = {};
const instance3 = new SomeClass(obj);
const instance4 = new SomeClass(obj);
// In that case, obj is shared between the two instances
console.log(instance3.arg1 === instance4.arg1); // true
instance3.arg1.test = 'value';
console.log(instance4.arg1); // { test: 'value' }