当前位置: 首页 > 面试题库 >

访问最终局部变量是否比Java中的类变量更快?

宦砚
2023-03-14
问题内容

我一直在寻找一些Java基本集合(的宝库,fastutil,HPPC)和我已经注意到,类变量有时声明为图案final的局部变量。例如:

public void forEach(IntIntProcedure p) {
    final boolean[] used = this.used;
    final int[] key = this.key;
    final int[] value = this.value;
    for (int i = 0; i < used.length; i++) {
        if (used[i]) {
          p.apply(key[i],value[i]);
        }
    }
}

我已经进行了一些基准测试,看来这样做时速度 快,但是为什么会这样呢?我试图了解如果注释掉函数的前三行,那么Java将有何不同之处。

注意:这似乎与此问题相似,但这是针对c
++的,并且没有解决为什么声明它们的原因final


问题答案:

final此处的关键字是红色鲱鱼。之所以会出现性能差异,是因为他们说的是两种不同的说法。

public void forEach(IntIntProcedure p) {
  final boolean[] used = this.used;
  for (int i = 0; i < used.length; i++) {
    ...
  }
}

的意思是,“获取一个布尔数组,并 对该 数组的每个元素执行某项操作。”

如果没有final boolean[] used,该函数将说“当索引小于used当前对象的字段的当前值的长度时,获取当前对象的used字段的当前值并对索引处的元素执行某些操作i”。

JIT可能更容易地证明循环绑定不变量以消除多余的绑定检查,等等,因为它可以更轻松地确定导致值used改变的原因。即使忽略多个线程,如果JIT可以p.apply更改其值,used那么JIT也无法消除边界检查或进行其他有用的优化。



 类似资料:
  • 这个程序是我的类的最终赋值,我在弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或实际上是最终的”时遇到了问题。该程序正在运行并发线程来对#的数组进行排序,然后找到该数组的高值和低值。当我在没有并发的情况下创建它时,我没有这个错误。我正在努力确定在哪里最终确定高变量和低变量。 这是产生错误的代码块。如果我使int高=数字[0];或int-low=数字[0];final,然后我得到一个错误

  • 我的代码有上述错误。我尝试通过将我的btnsav声明为最终版本来修复此问题,但随后我收到另外两个错误: 未知类:“btnsave” 不是一个声明 你知道我如何修复这个错误吗?

  • 问题内容: 好的,我知道标题不能完全解释这个问题。因此,我正在编写一个执行大量计算的程序,并尝试对其进行优化,以使其运行不会太慢。我有一个函数,该函数是一个类的成员,该函数被调用约500万次。这是功能: 我想知道在类中声明变量vpPointx和vpPointy是否比每次调用函数时声明它们更好/更快。这将是一个很好的优化还是效果不大? 通常,如果这里有任何可以优化的内容,请告诉我。 问题答案: 通过

  • 我知道这个话题听起来像是重复的,但我并不是想在这里调试这个问题,而是想绕过它。 我的程序应该做的是:对于文件夹中的每个文件,创建一个新按钮。如果您单击此按钮,请输入您刚输入的文件夹的名称。 现在我遇到的问题是,“fileName”变量需要放在final中,因为Java提供的是对象的指针,而不是值本身。但如果我这样做,则只会为任何按钮发送最后选择的文件名。

  • 我正在尝试让一个按钮将其值与其他变量进行比较。在onClick方法中,我收到一个错误,说变量在内部类中被访问,需要声明为最终变量。问题是变量应该被更改,所以我无法使其成为最终变量。我如何解决这个问题?这是我的代码:

  • 问题内容: 我想知道使用最终局部变量是否有可用性。当继承出现时,变量无论如何都不会被覆盖。例如下面的简单代码 这个例子很简单,可能不是一个相关的代码,但是问题比较笼统。我已经看到了很多代码(全部都包含在具有最终局部变量的main函数中)是否有将局部变量声明为final other的可用性。不能在同一功能中进行编辑? 问题答案: 首先,关于变量被“覆盖”的部分具有两个非常不同的含义。对于类和方法,它