繁体   English   中英

休息正在减慢我的循环?

[英]break is slowing down my loop?

我有一个嵌套循环,它循环访问数组中两个元素的所有组合。 但是,如果两个值的总和太大,我想跳到下一个x

这是Java代码段:

/* Let array be an array of integers
 * and size be equal to its length.
 */

for (int a = 0; a < size; a++)
{
    int x = array[a];

    for (int b = 0; b < size(); b++)
    {
        int y = array[b];

        if ((x + y) < MAX)
        {
            // do stuff with x and y
        }
        else
        {
            // x + y is too big; skip to next x
            break;
        }       
    }
}

这完全符合预期。

但是,如果我将break语句替换为b = size; 其运行速度惊人地提高了约20%。 注意,通过设置b = size; ,条件的内部for变为false,并且执行将继续进行外部a循环的下一次迭代。

为什么会这样? 好像应该更快地break ,因为我以为它可以节省任务,跳转和比较。 虽然显然没有。

为什么会这样? 看来休息应该更快...

IMO,最可能的解释是某种JVM预热效果,特别是因为总时间(120毫秒对74毫秒)是如此之小。 如果将该循环包装在另一个循环中,以便可以在同一运行中重复执行时间测量,则此异常可能会消失。

(仅增加阵列大小并不一定会有所帮助。确保您已考虑JVM预热的最佳方法是使它无法使用基准测试框架;例如Caliper 。但是,如果失败,请将“代码段”放入方法并反复调用。)

...正如我以为的那样,它可以节省任务,跳转和比较。 虽然显然没有。

尚不清楚。 您的Java代码将通过javac (或您的IDE)编译为字节码。 运行代码时,它首先解释字节码,然后再由JIT编译器将它们编译为本地代码:

  • JIT编译所花费的时间(可能)包括在您的时间测量中……以及热身异常的一种来源。

  • JIT编译器生成的代码受解释时收集的统计信息影响。 通常要衡量的一件事是分支(例如if测试)是顺其自然还是顺其自然。 这用于进行分支预测...如果正确,则可以使测试和分支指令序列更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM