【问题标题】:Declaring a variable in a for loop for the array length [duplicate]在for循环中为数组长度声明一个变量[重复]
【发布时间】:2015-04-28 10:34:54
【问题描述】:

我最近一直在查看代码并注意到在 for 循环中使用了这种语法

for(int i = 0, len = myArray.length; i < len; i++){
    //some code
}

相对于:

for(int i = 0; i < myArray.length; i++){
    //some code
}

理由是它更有效,因为您不必在每个循环中一直查找 myArray.length 属性。

我创建了一个测试来检查是否是这种情况,在我的所有测试中,第一个 for 循环方法都比第二个快得多(大约 70%)。

我很好奇为什么这种语法没有被更广泛地采用,并且我认为这是在数组中使用 for 循环的更好方法是正确的。

【问题讨论】:

  • “我很好奇为什么这种语法没有被更广泛地采用,我认为它是在数组中使用 for 循环的更好方法是正确的。”因为今天大多数人都使用迭代器:-)
  • 恕我直言,第一个语法没有被广泛使用,因为它是一种微优化,如果你需要挤出这么多的性能,可能你必须重新考虑很多事情,for 循环可能做最后一个。
  • 这很好。即使我不喜欢在 for 循环中使用 .size() 和 .length() 方法。更可接受的方法是 for(String str: myarray){}
  • 请记住,如果数组长度在循环中发生变化,第一个将解开。
  • 当从方法调用(例如 list.size())而不是字段访问(array.长度)。

标签: java for-loop


【解决方案1】:

这是一种缓存优化,正如您所指出的,防止多次读取length。通常,不需要执行这种微优化,这可以解释为什么大多数工程师乐于在每个循环之后检查 length 而不是缓存它,但它在高性能代码中很有用。也可以这样写,反转循环的方向,避免使用另一个变量来保存数组的长度:

for (int i = myArray.length - 1; i >= 0; i--) {
    // some code
}

【讨论】:

    【解决方案2】:

    在我看来,大多数 Java 程序员都会在数组的情况下使用 for-each 循环,除非我们想对索引值进行一些操作

    【讨论】:

    • 但是这种做法在 Java 5 之前也是不受欢迎的。
    【解决方案3】:

    第一种方法只评估一次长度,而不是第二种方法,每次循环都评估长度。

    【讨论】:

    • 那里没有计算,只有字段访问,无论如何这很可能会被优化。
    • 我将计算这个词改为评估,但我认为 JVM 会对此进行优化
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多