类的(代码)大小没有(直接)性能结果。另外,只要你没有或期待性能问题,不要专注于优化(主要是优化导致更多的工作,有时更多的不可读/可维护的代码)。只有在需要时才进行性能优化。最初,始终专注于小班/可读性/可维护性。尤其是最后一个看起来很重要,因为你定期添加功能
您已经提供了一些功能区域,如投影,标准化。也许你可以将它们移动到其他类或辅助类,如果他们不需要任何数据。如果有一些特定的矢量类型,或者你可以使用策略模式来执行不同类型的算法,也许你可以使用继承拆分你的类。但是,也许你只有数百个可以在矢量上使用的函数;在这种情况下,使用助手方法,传递矢量并将每个方法放在最好的助手类中。
像例如正常化:
public abstract VectorNormalization
{
public void Normalize(Vector v)
{
.. do something with v
}
public void NormalizeDifferent(Vector v)
...
}
,您可以通过
Vector v = Vector(3,4);
VectorNormalization.Normalize(v);
关于绩效调用它。调用Normalize函数:
- 通常,辅助类在内部使用所谓的v表。要调用一个辅助方法,编译器需要将v-table start添加到函数中并调用它,这是一个非常可忽略的性能损失。我认为C++和Python的工作非常相似。
- 此外,堆栈需要填充矢量。
- 函数调用已完成。
只有第一个会改变,因为在一个大的班级中,第二和第三个也是需要的。
您可以通过在需要的地方优化算法本身来赢得更高的性能。
btw,
您应该考虑使用和简单性,而不是性能。这些额外的方法是否总是被使用或者是专门的?如果某些额外的好东西在派生类中,您的设计会更好吗?无论如何,他们是否与班级相关(考虑应用于代码的规范化)?他们会更适合在另一个班级(混合),所以有趣的东西可以重用?保持它(你的课)简单。 – cdarke
我的确在第一手考虑使用和简单性,但我仍然对性能影响感到好奇。我喜欢课堂设计的方式,每种方法都与课堂相关。但是其中很多都是专门的,所以如果将这些方法转换成功能并不是什么大问题,那么它将会使性能提高很多。 –
好的,内存中字节码的布局将非常具体实现和版本。但是请考虑整个模块在导入时被编译和加载。包含专门方法的另一个模块中的派生类不需要导入(因此编译和加载),因此只会在需要时提供开销。代码可以被构建成包(目录树)。您需要使用自己的代码进行基准测试,以查看是否存在显着的性能差异。这将取决于数量。 – cdarke