2016-07-14 66 views
1

我建立了一个类矢量前段时间我很常用。随着时间的推移,我添加了越来越多的有趣且有用的方法,如标准化,投影等等。班级开始变得相当大,并且可能会变得更大。大班是否会影响表现?

由于我使用这个类来计算1000多个对象的位置和运动,并且每1/60秒创建一个新实例,我开始担心性能和/或内存可能会成为问题。

我试过在Google上寻找答案,但只找到了指向C++的this,但也许答案仍然适用?

否则我的问题是:是否有任何重大的性能问题?我应该尝试让我的班级变小一点,并创建功能吗?使用我应该注意的大类还有其他重大缺点吗?

+0

您应该考虑使用和简单性,而不是性能。这些额外的方法是否总是被使用或者是专门的?如果某些额外的好东西在派生类中,您的设计会更好吗?无论如何,他们是否与班级相关(考虑应用于代码的规范化)?他们会更适合在另一个班级(混合),所以有趣的东西可以重用?保持它(你的课)简单。 – cdarke

+0

我的确在第一手考虑使用和简单性,但我仍然对性能影响感到好奇。我喜欢课堂设计的方式,每种方法都与课堂相关。但是其中很多都是专门的,所以如果将这些方法转换成功能并不是什么大问题,那么它将会使性能提高很多。 –

+0

好的,内存中字节码的布局将非常具体实现和版本。但是请考虑整个模块在导入时被编译和加载。包含专门方法的另一个模块中的派生类不需要导入(因此编译和加载),因此只会在需要时提供开销。代码可以被构建成包(目录树)。您需要使用自己的代码进行基准测试,以查看是否存在显着的性能差异。这将取决于数量。 – cdarke

回答

2

类的(代码)大小没有(直接)性能结果。另外,只要你没有或期待性能问题,不要专注于优化(主要是优化导致更多的工作,有时更多的不可读/可维护的代码)。只有在需要时才进行性能优化。最初,始终专注于小班/可读性/可维护性。尤其是最后一个看起来很重要,因为你定期添加功能

您已经提供了一些功能区域,如投影,标准化。也许你可以将它们移动到其他类或辅助类,如果他们不需要任何数据。如果有一些特定的矢量类型,或者你可以使用策略模式来执行不同类型的算法,也许你可以使用继承拆分你的类。但是,也许你只有数百个可以在矢量上使用的函数;在这种情况下,使用助手方法,传递矢量并将每个方法放在最好的助手类中。

像例如正常化:

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,

+0

我已经阅读了几次你的答案,我不确定它是否回答我的问题。不要误解我的意思,我感谢你给我举例说明如何组织我的代码来保持可读性/可维护性,这一直是我的优先事项,但我更关心性能影响和pythonic方式。仍然+1有价值的信息 –

+0

我增加了一些关于性能的东西。 –