java - Break 减慢了我的循环速度?

标签 java iteration

我有一个嵌套循环,它迭代数组中两个元素的所有组合。但是,如果两个值的总和太大,我想跳到下一个 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;
        }       
    }
}

这完全符合预期。

但是,如果我用 b = size; 替换 break 语句,它的运行速度会快大约 20%。 请注意,通过设置b = size;,内部 for 条件变为 false,并继续执行外部 a 循环的下一次迭代。

为什么会发生这种情况?看起来 break 应该更快,因为我认为它可以保存赋值、跳转和比较。尽管显然并非如此。

最佳答案

Why would this happen? It seems like break should be faster ...

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

(仅增加数组大小不一定有帮助。确保已解决 JVM 预热异常的最佳方法是使用基准测试框架;例如 Caliper 。但是,如果做不到这一点,请将“片段”到方法中并重复调用它。)

... as I would have thought it saves an assignment, jump, and compare. Though clearly it does not.

完全不清楚。您的 Java 代码由 javac (或您的 IDE)编译为字节码。当您运行代码时,它开始解释字节码,然后稍后它们被 JIT 编译器编译为 native 代码:

  • JIT 编译所花费的时间(可能)包含在您的时间测量中......并且是预热异常的一个来源。

  • JIT 编译器生成的代码受到解释时收集的统计信息的影响。通常测量的事情之一是分支(例如 if 测试)是否采用一种方式或另一种方式。这用于进行分支预测……如果正确的话,会使测试和分支指令序列更快。

关于java - Break 减慢了我的循环速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695869/

相关文章:

java - 如何使用索引使Web应用程序中的数据库访问更快?

java - POST 请求得到 405 响应,而不是由 access-denied-handler 处理

java - 如何解决 ClassNotFoundException?

java - 如何画颜色

java - 将 SQL 条件添加到 CriteriaQuery

c# - C# 中是否有支持故障安全迭代的良好 IList 和 IDictionary 实现?

python - 如何巧妙地将 Python 列表的每一项传递给函数并更新列表(或创建一个新列表)

java - 迭代自定义哈希表

c++ - 我如何递归地重写这个?

function - 按要求次数执行功能