为什么break函数会为for循环添加额外的处理时间?

时间:2016-08-03 10:06:04

标签: java optimization

我目前正在编写一本关于简单优化的书。 显示的算法之一是:

  

将所有溶液打印到 3 + b 3 = c 3 + d 3 (其中a, b,c,d小于   1000)

(我选择了100,所以它会在我的慢速上网本上运行得更快)

I programmed up their solution(包括他们的解决方案及其首次提供的优化),但提供的中断优化实际上使算法慢了一点。

public static void doUnoptimised() {
    for(int a = 1; a < 100; a++) 
    {
        for(int b = 1; b < 100; b++)
        {
            for(int c = 1; c < 100; c++)
            {
                for(int d = 1; d < 100; d++) {
                    if(Math.pow(a, 3) + Math.pow(b, 3) == Math.pow(c, 3) + Math.pow(d, 3))
                    {
                        System.out.println("A:" + a + " B:" + b + " C:" + c + " D:" + d);
                    }
                }
            }
        }
    }
}

public static void doFirstOptimised() {
    for(int a = 1; a < 100; a++) 
    {
        for(int b = 1; b < 100; b++)
        {
            for(int c = 1; c < 100; c++)
            {
                for(int d = 1; d < 100; d++) {
                    if(Math.pow(a, 3) + Math.pow(b, 3) == Math.pow(c, 3) + Math.pow(d, 3))
                    {
                        System.out.println("A:" + a + " B:" + b + " C:" + c + " D:" + d);
                        break;
                    }
                }
            }
        }
    }
}

为什么?请注意,这不是我的解决方案,这是本书中显示的解决方案,后来他们继续进行更多优化,但我对为什么这种优化是如此史诗般的失败感兴趣。

编辑 - 也许我在这里不够清楚。我知道这是一个几乎没有明显的变化,我理解为什么这是一个改进,并已经经历了书中提供的更好的优化。 (感谢那些给予更好的优化的人,感谢他们的努力)然而,这个特殊的步骤根本不起作用,我试图找出原因。但在这个阶段,我的jvm似乎很奇怪。

1 个答案:

答案 0 :(得分:0)

此优化中假设dab的任意组合只有一个c

break;所做的是停止内循环,所以一旦我们有了解决方案,我们就可以放弃寻找另一个解决方案,这可以节省工作量,从而减少时间。

有许多更好的优化,但是使用这样的break;,或者return是在较少设计的情况下使用的常见优化。

例如,如何实现ArrayList.indexOf天真地忽略null值。

public int indexOf(Object o) {
    int index = -1;
    for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            if (index == -1)
                index = i;
    return index;
}

注意:这必须扫描每个条目,即使它是第一个要找到的条目。更快的方法是用break来说;如果我有解决方案,请停止迭代。

public int indexOf(Object o) {
    int index = -1;
    for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            index = i;
            break;
        }
    return index;
}

但是,这里不需要休息,因为接下来的事情是return

public int indexOf(Object o) {
    for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            return i;
    return -1;
}

考虑到null值,实际的实现是

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}