我有一个父类,它有一个ints
的数组,但是1/3的子类只需要一个整数。在Java中,访问整数数组的值与访问单个整数变量的速度有多快?
我在这里想知道,如果只是使用intAry[0]
这些类或不是那么快。
我有一个父类,它有一个ints
的数组,但是1/3的子类只需要一个整数。在Java中,访问整数数组的值与访问单个整数变量的速度有多快?
我在这里想知道,如果只是使用intAry[0]
这些类或不是那么快。
访问数组时,涉及到一个边界检查,这在访问单个变量时不会发生。但是考虑到JIT
处理器缓存效应和其他类似情况,它会变得更加复杂,并且您不容易得出可靠的结论。
你会明智地专注于实际的热点。
在java中访问数组索引在概念上总是比访问普通字段慢。这是因为该字段直接包含在对象存储器中,而在数组索引的情况下,它需要先读取字段,然后再读取索引。它也可能会导致检查索引是否处于边界的额外惩罚,JIT可能无法优化(基本上这意味着另一个读取数组长度加上比较以及希望正确预测的分支)。
另一方面,如果你的类发生以前是单形的,引入子类可能会增加实际调用方法的额外成本。
虽然差可以在更复杂的设计,其中的总执行时间的显著部分被用在别处在紧密循环显著,其不显着。
正如很多评论已经指出的那样,在你编写代码之前尝试优化它,并且在大部分时间都没有任何提示的情况下进行优化是过早的优化,并且很可能浪费了时间和精力。
不成熟的优化是邪恶的 –
@VinceEmigh如果两种版本的代码在复杂性和可读性方面是等同的,那么选择速度更快的代码没有任何坏处。虽然在这个特定情况下,我怀疑是否有重大差异。 – assylias
@assylias“*虽然在这种特殊情况下,我怀疑是否存在显着差异*”这就是为什么它是邪恶的,并且伤害以浪费时间和精力的形式出现。在你甚至知道需要优化之前对事情进行优化可能会浪费大量时间,结果导致开发人员花费了一个小时的时间来研究这个主题,以便意识到他只能节省几个纳秒。这是一个很好的例子。 –