我不久前构建了一个我经常使用的类Vector。随着时间的推移,我添加了越来越多有趣且有用的方法,例如标准化、投影等。类开始变得相当大,并且可能会变得更大。
由于我使用此类来计算 1000 多个对象的位置和运动,并且每 1/60 秒创建一个新实例,因此我开始担心性能和/或内存可能是一个问题。
我尝试在 Google 上寻找答案,但只找到 this它指的是 C++,但也许答案仍然适用?
否则我的问题是:是否存在任何重大的性能问题?我应该尝试让我的类更小并创建函数吗?使用大类还有其他我应该注意的重大缺点吗?
最佳答案
类的(代码)大小不会(直接)影响性能。
此外,只要您没有或预期没有性能问题,就不要专注于优化(大多数优化会导致更多工作,有时会导致更多不可读/不可维护的代码)。仅在需要时优化性能。最初,始终专注于小类/可读性/可维护性。尤其是最后一个似乎很重要,因为您定期添加功能。
您已经给出了一些功能区域,例如投影、标准化。也许您可以将它们移动到其他类,或者如果它们不需要任何数据,则可以将它们移动到辅助类。
如果有一些特定的向量类型,也许您可以使用继承来拆分您的类,或者您可以使用策略模式来执行不同类型的算法。但也许您只有数百个可以在向量上使用的函数;在本例中,使用辅助方法,传递向量并将每个方法放入最佳辅助类中。
例如标准化:
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 的工作原理非常相似。
- 此外,堆栈需要填充向量。
- 函数调用已完成。
只有第一个会被改变,因为在一个大类中,第二个和第三个也需要。
通过在需要的地方优化算法本身,您可能可以在性能方面赢得更多胜利。
顺便说一句,
关于python - 大类对性能有显着影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38368720/