java - 我写了两段代码,几乎一模一样,但一个运行得比另一个快得多(Java)
问题描述
我跑了这段代码:(外循环运行100次,内循环运行10亿次。)
long l = 0;
for(int i = 0; i < 100; i++)
for(int j = 0; j < 1000000000; j++)
l++;
System.out.println(l);
当我运行它时,这大约需要 11-12 秒。
然后我运行了这段代码:
long l = 0;
int i = 0, j = 0;
for(; i < 100; i++)
for(; j < 1000000000; j++)
l++;
System.out.println(l);
每当我运行它时,这大约需要 100 毫秒(0.1 秒)。
有谁知道为什么会有很大的不同?我的理论是,对于 'i' 的每个值,内部 for 循环都必须再次初始化 j,这使它有更多的操作要做,所以它需要更长的时间是有道理的。然而,差异是巨大的(大约 100 倍),并且在其他类似的测试中,同样的事情不会发生。
如果你想自己看,我是这样计时的:
class Main {
static long start, end;
public static void main(String[] args) {
start();
long l = 0;
int i = 0, j = 0;
for(; i < 100; i++)
for(; j < 1000000000; j++)
l++;
System.out.println(l);
end();
print();
}
public static void start() {
start = System.currentTimeMillis();
}
public static void end() {
end = System.currentTimeMillis();
}
public static void print() {
System.out.println((end - start) + " ms.");
}
}
解决方案
第二个函数仅在 i 的第一次迭代中遍历 j。此时 j 超过了 for 循环的限制并且永远不会再次运行,因为它不会在 i 的下一次迭代中重置
推荐阅读
- python - Django filter query if filter parameter exists
- rust - Cycle a Rust iterator a given number of times
- laravel - 我怎样才能解决这个 belongsToMany 枢轴错误
- javascript - how to use async and await in koa?
- java - 从 USB 密钥运行 Eclipse:java 环境错误
- postgresql - 无法将 .ddl 文件导入 postgress 服务器
- batch-file - 通过所有子文件夹运行 Batch FOR LOOP
- postgresql - 使用时间戳列索引和 GREATEST 函数的 PostgreSQL 查询优化
- php - 使用递归 php 函数构建数组
- php - 如何过滤使用 foreach 循环生成的数组的输出