在性能方面,Java中的double数组与自定义类相比哪一个更好?

3
我正在使用Java编写GJK算法(凸形状的碰撞检测)的简单实现,它涉及对3D向量进行大量简单的计算。在性能与可读性方面,将点存储为double [3]并具有处理它们的整个主机的静态方法(添加,减去,点乘,叉乘,否定等),还是使用包含在类中的方法更好呢?
数组的问题在于,如果使用专门的方法进行简单的减法(例如),则需要多次循环,或者如果它们被硬编码,则代码变得非常长。Point对象使代码更易读,但对于我认为不是微不足道的性能开销是否值得呢?

我个人更倾向于可读性,并采用面向对象的方法。然而,很少有东西比直接使用原始值更快。 - aroth
直接使用原始类型几乎总是更快而且不会更慢(除非你做错了什么),但你必须小心布局。并行数组或顺序布局哪个更好取决于你对数据的处理方式。可读性/性能权衡是否值得取决于你个人的观点。 - harold
该类每个实例需要两个单词的开销,并且在使用点数组时涉及到额外的间接寻址。从缓存的角度来看,由于对象应该在停止并复制垃圾收集器上彼此靠近,因此额外的间接寻址不应该太糟糕。速度会慢一些吗?当然,但更易读,而且可能不会慢那么多。 - Voo
5个回答

6
我的建议是:先用最少的力气让它工作,然后再进行优化。也许你的应用程序的瓶颈完全是其他方面的问题,而碰撞检测的改进只是其中的一小部分。
例如,假设你发现你的应用程序花费了10%的时间进行碰撞检测,而50%的时间进行磁盘读取。如果你可以使用缓存将磁盘读取减少一半,那么你就可以提高25%的执行效率,这比完全消除碰撞检测时间所能达到的最优效果还要多两倍。
正如Donald Knuth所说,“过早的优化是万恶之源。”

0

我想

Point point = new Point(x, y, z);

更像是一个点而不是

double[] point = {x, y, z};

所以,去上课吧!


0

如果您需要执行其他操作来操纵、搜索或编辑数据,我会使用对象。也许您的基类也可以是一个数组。


0
在我看来,面向对象编程的基本原则是让对象定义一个契约并履行它们的责任(通常是单一责任)。因此,你肯定应该采用类的方式;这样还可以使你的类更易于维护和阅读。

0
创建一个类总是更好的选择,这样不仅可以实现可读性,还可以实现可扩展性,您随时可以扩展类的含义。在我理解面向对象编程的魔力之前,我也曾有过同样的感觉,但现在我真正知道它对我的项目所产生的差异。您可以从面向对象编程中获得很多好处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接