2015-12-14 80 views
-3

我有一个父类,它有一个ints的数组,但是1/3的子类只需要一个整数。在Java中,访问整数数组的值与访问单个整数变量的速度有多快?

我在这里想知道,如果只是使用intAry[0]这些类或不是那么快。

+2

不成熟的优化是邪恶的 –

+1

@VinceEmigh如果两种版本的代码在复杂性和可读性方面是等同的,那么选择速度更快的代码没有任何坏处。虽然在这个特定情况下,我怀疑是否有重大差异。 – assylias

+0

@assylias“*虽然在这种特殊情况下,我怀疑是否存在显着差异*”这就是为什么它是邪恶的,并且伤害以浪费时间和精力的形式出现。在你甚至知道需要优化之前对事情进行优化可能会浪费大量时间,结果导致开发人员花费了一个小时的时间来研究这个主题,以便意识到他只能节省几个纳秒。这是一个很好的例子。 –

回答

1

访问数组时,涉及到一个边界检查,这在访问单个变量时不会发生。但是考虑到JIT处理器缓存效应和其他类似情况,它会变得更加复杂,并且您不容易得出可靠的结论。

你会明智地专注于实际的热点。

1

在java中访问数组索引在概念上总是比访问普通字段慢。这是因为该字段直接包含在对象存储器中,而在数组索引的情况下,它需要先读取字段,然后再读取索引。它也可能会导致检查索引是否处于边界的额外惩罚,JIT可能无法优化(基本上这意味着另一个读取数组长度加上比较以及希望正确预测的分支)。

另一方面,如果你的类发生以前是单形的,引入子类可能会增加实际调用方法的额外成本。

虽然差可以在更复杂的设计,其中的总执行时间的显著部分被用在别处在紧密循环显著,其不显着。

正如很多评论已经指出的那样,在你编写代码之前尝试优化它,并且在大部分时间都没有任何提示的情况下进行优化是过早的优化,并且很可能浪费了时间和精力。

+0

我其实已经完成了代码。它是一个有组织的投入轮询系统的一部分,我只是优化了一切,因为它经常被调用。 – Meeesh

+0

@Meesch优化“一切”,虽然也许诱人并不经济。在任何典型的程序中,根据经验法则,10%的代码可以执行90%的执行时间。优化其他任何这些10%是不经济的,因为如果你优化了所有的代码,你会投入10倍的时间,或者把它变得更糟*,你的宝贵时间的9/10被浪费*来优化90%的表演只贡献了10%。这就是为什么你首先要找出*要优化的东西,然后挑选出10%,然后把100%的精力集中在那里*。 – Durandal