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