代码之家  ›  专栏  ›  技术社区  ›  Koekiebox

Java for循环计算

  •  11
  • Koekiebox  · 技术社区  · 15 年前

    我想知道条件评估是否在 for while 每次循环周期结束时在Java中循环。

    例子:

    int[] tenBig = new int[]{1,2,3,4,5,6,7,8,9,10};
    
    for(int index = 0;index < tenBig.length;index++){
        System.out.println("Value at index: "+tenBig[index]);
    }
    

    威尔 index < tenBig.length 每次循环结束时都要执行吗?

    假设和经验告诉我是的。

    tenBig.length 是一个常数,因此不会对性能产生影响。

    但是假设条件操作在不同的情况下需要很长时间。 我知道合乎逻辑的做法是 十倍长度

    不过,我还是想确保每次都会进行评估。

    8 回复  |  直到 11 年前
        1
  •  12
  •   Jon Skeet    15 年前

    是的,它将在循环的每次迭代中逻辑地计算中间操作数的整个值。当然,在JIT知道得更好的情况下,它可以做一些聪明的事情(甚至可以根据循环条件在循环中删除数组边界检查)。

    注意,对于JIT不知道的类型,它可能不能像这样进行特别的优化,但是仍然可以内联,比如获取 size() ArrayList<T> .

    最后,为了可读性,我通常更喜欢增强的for循环:

    for (int value : tenBig) {
        ...
    }
    

        2
  •  6
  •   T.J. Crowder    15 年前

    对。具体来说,条件部分被执行 之前

    以你为例:

    for(int index = 0;index < tenBig.lenght;index++) {
        /* ...body... */
    }
    

    int index = 0;
    while (index < tenBig.length) { // happens on each loop
        /* ...body... */
    
        index++;
    }
    
        3
  •  4
  •   Justin Niessner    15 年前

    是的,必须为循环的每次迭代计算表达式,以确定是留在循环内还是继续程序执行。

    记住,你可以这样做:

    for(int a = 0, z = 26; a < z; a++, z--){
        // Do some work
    }
    

    你说得对,如果for循环条件中的计算可以移到单独的变量中,你应该这样做:

    for(int i = 0; i < ((someCount / 2) * 21.6); i++){
    }
    

    很容易做到:

    int maxVal = (someCount / 2) * 21.6;
    
    for(int i=0; i < maxVal; i++){
    {
    
        4
  •  1
  •   codaddict    15 年前

    循环不变量 Loop-invariant code motion

    但在解释模式下运行时 没有多少优化工作要做。

        5
  •  1
  •   Martín Schonaker    15 年前

    这里有几个字节码 compiling examples from the JVM spec .

    据我所知,这种情况每次都会被评估。

    当做。

        6
  •  1
  •   Ferid Gürbüz    15 年前

    index < tenBig.length

        public static void main(String[] args) {
            int[] tenBig = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
            for (int index = 0; isEvaluated() && index < tenBig.length; index++) {
                System.out.println("Value at index: " + tenBig[index]);
            }
        }
    
        public static boolean isEvaluated() {
            System.out.println("evaluated");
            return true;
        }
    

    它会打印出来 "evaluated" 就在周期开始之前。在循环结束前再做一次。

        7
  •  1
  •   wutzebaer    6 年前

    每一次 所以:

    for (int i = 0; i < Math.random() * 50; i++) {
        System.out.println("" + i);
    }
    

    对的:

    double random = Math.random();
    for (int i = 0; i < random * 50; i++) {
        System.out.println("" + i);
    }
    
        8
  •  0
  •   adranale    15 年前

    请问编译器是否缓存十倍长度因为他知道它在循环中不会改变?或者询问编译器是否自动知道整个表达式索引<十倍长度接下来的9次不需要评估?

        9
  •  0
  •   Jas    15 年前

    除此之外,即使tenBig的长度是const,循环将始终访问此属性,因此将其分配给变量是理想的(即使在您的示例中它不是合理的速度增益)。