Dart 是否为每个新实例创建新方法?
Does Dart create new methods for each new instance?
我目前正在为我正在进行的项目设计 class 结构。我有一个使用一个实例状态的方法。我现在不知道是将此方法设为静态并将此实例状态解析为参数还是仅将方法绑定到实例更好。
如果性能没有问题,我会毫无疑问地将方法与实例联系起来,因为这样更简洁。但就我而言,表现将非常重要。那么,使方法静态/非静态在性能方面有什么不同吗?
如果没有区别,那么生成的 *.dart.js javascript 也是如此吗?
编辑:
阅读我自己的问题后,它并不是很连贯。我会尝试再次制定它,但更清晰。
此代码...
class MyClass {
void foo() {}
}
void main() {
MyClass a = new MyClass();
MyClass b = new MyClass();
print(a.foo == b.foo);
}
...输出错误。这让我觉得对于每个新实例都会创建一个新方法。如果那是真的,这在我看来是在浪费记忆。那么,是否每个新实例都会创建其所有绑定方法的副本?
PS:题目基本和一样,但是对于Dart来说
不,创建两个实例不会复制方法。方法类似于静态函数,其中对象实例作为参数传递,名称为 this
。
在 运行 进入实际性能问题之前,不要太担心性能问题,尤其是在这样的微观层面上。
通常性能对于应用程序代码库的大部分来说不是问题,因为大多数代码通常 运行 很少。
当您 运行 遇到性能问题时,您可以调查并找到执行得足够频繁的真正热点,以便优化真正发挥作用。
Dart classes 没有针对不同实例的不同方法。
每个 class.
只有一种方法
Extracting 函数每次执行时都会创建一个新的函数对象,这些对象可能相等也可能不相等,具体取决于您从哪个对象中提取哪个函数:
class MyClass {
void foo() {}
}
void main() {
MyClass a = new MyClass();
MyClass b = new MyClass();
print(a.foo == b.foo); // False.
print(a.foo == a.foo); // True
print(identical(a.foo, a.foo)); // False!
}
当您从对象中执行方法提取时,您创建了一个新对象。新对象是一个 "closure" ,其中包含要调用的函数和调用它的对象。如果两个这样的闭包引用 相同对象 上的相同函数,则它们是相等的(根据 operator==)。这就是 a.foo
和 b.foo
不相等的原因 - 它们分别等同于 () => a.foo()
和 () => b.foo()
,并且因为 a
和 b
不是相同的对象,函数对象不被认为是相等的。
我目前正在为我正在进行的项目设计 class 结构。我有一个使用一个实例状态的方法。我现在不知道是将此方法设为静态并将此实例状态解析为参数还是仅将方法绑定到实例更好。
如果性能没有问题,我会毫无疑问地将方法与实例联系起来,因为这样更简洁。但就我而言,表现将非常重要。那么,使方法静态/非静态在性能方面有什么不同吗?
如果没有区别,那么生成的 *.dart.js javascript 也是如此吗?
编辑: 阅读我自己的问题后,它并不是很连贯。我会尝试再次制定它,但更清晰。
此代码...
class MyClass {
void foo() {}
}
void main() {
MyClass a = new MyClass();
MyClass b = new MyClass();
print(a.foo == b.foo);
}
...输出错误。这让我觉得对于每个新实例都会创建一个新方法。如果那是真的,这在我看来是在浪费记忆。那么,是否每个新实例都会创建其所有绑定方法的副本?
PS:题目基本和
不,创建两个实例不会复制方法。方法类似于静态函数,其中对象实例作为参数传递,名称为 this
。
在 运行 进入实际性能问题之前,不要太担心性能问题,尤其是在这样的微观层面上。 通常性能对于应用程序代码库的大部分来说不是问题,因为大多数代码通常 运行 很少。 当您 运行 遇到性能问题时,您可以调查并找到执行得足够频繁的真正热点,以便优化真正发挥作用。
Dart classes 没有针对不同实例的不同方法。 每个 class.
只有一种方法Extracting 函数每次执行时都会创建一个新的函数对象,这些对象可能相等也可能不相等,具体取决于您从哪个对象中提取哪个函数:
class MyClass {
void foo() {}
}
void main() {
MyClass a = new MyClass();
MyClass b = new MyClass();
print(a.foo == b.foo); // False.
print(a.foo == a.foo); // True
print(identical(a.foo, a.foo)); // False!
}
当您从对象中执行方法提取时,您创建了一个新对象。新对象是一个 "closure" ,其中包含要调用的函数和调用它的对象。如果两个这样的闭包引用 相同对象 上的相同函数,则它们是相等的(根据 operator==)。这就是 a.foo
和 b.foo
不相等的原因 - 它们分别等同于 () => a.foo()
和 () => b.foo()
,并且因为 a
和 b
不是相同的对象,函数对象不被认为是相等的。