[英]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.