![]() |
1
28
只需将数组赋给一个局部变量 之前 遍历元素。
通过只调用一个虚拟方法来获取动态数组,可以从循环中消除该开销。现在,循环可以遍历数组项,而无需虚拟接口方法调用的额外开销。 |
![]() |
2
7
但正如Allen所说,这会导致对getter方法(GetArray)的调用,它被分类为“virtual”,甚至不需要编写它,因为它是接口的一部分。 另外,使用动态数组意味着调用者和被调用者都将进行大量的引用计数(如果查看生成的程序集代码,可以看到这一点)。 所有这一切已经足够解释测量的速度差,但确实可以很容易地克服使用一个局部变量和读取数组只有一次。当您这样做时,对getter的调用(以及随后的所有引用计数)只发生一次。与其他测试相比,这个“开销”变得无法测量。 但是请注意,一旦走上这条路,就会失去封装,对数组内容的任何更改都不会反映到接口中,因为数组具有写时复制的行为。只是个警告。 |
![]() |
3
3
但是,由于您的问题涉及到改进的OO设计,我觉得您的设计中有一个特殊的更改,也可以改进性能,因此应该进行讨论。
是的,您只需将接口一次遵从于一个局部变量,就可以获得性能上的巨大改进,但是您仍然可以在另一个对象中四处寻找。面向对象设计的一个重要目标是 不 去你不属于的地方找找看。这实际上违反了 Law of Demeter .
然后在里面
这将与艾伦的建议一样快,将是一个更好的设计。
是的,我完全知道您只是简单地创建了一个简单的示例来说明通过接口重复查找某些内容的性能开销。但问题是,如果由于通过接口的过度访问而导致代码性能低于最佳值,那么您就有了一种代码味道,这意味着您应该考虑将某些工作的责任转移到另一个类中。在你的例子中
|
![]() |
4
1
|
|
simply lemon · python上链表的添加方法 1 年前 |
|
Anonymous · 为什么在这个例子中self和类名的用法不同? 1 年前 |
![]() |
P N Singh · 在CPP Oops中调用对象而不创建它 1 年前 |
![]() |
Muthuraj · 如何创建一个通用工厂来创建某种类型的实例[重复] 1 年前 |
![]() |
Andy Votava · 从父类定义调用学生方法 1 年前 |