Arm*_*man 0 java loops for-loop
假设我有一个像这样的 for 循环(忽略糟糕的效率,这只是一个例子):
ArrayList<Integer> primes = new ArrayList<>();
for(int i = 0; i < 10000; i++){
if(isPrime(i)){
primes.add(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我想以 10% 的间隔显示循环的进度,但我不知道如何在不影响性能的情况下做到这一点。到目前为止我能想到的只有这些:
ArrayList<Integer> primes = new ArrayList<>();
int n = 10000/10;
for(int i = 0; i < 10000; i++){
if(isPrime(i)){
primes.add(i);
}
if(i == n){
System.out.println(String.valueOf(i).charAt(0)+"0% Complete");
n+=10000/10;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来做到这一点?
我发现在打印进度时对步骤值(例如 10% 增量)进行硬编码并不是那么有用。最好每 X(毫秒)秒打印/更新一次进度,这样您就可以始终看到实际进度。
如果您的逻辑足够慢以至于需要进度,则打印进度对性能的影响很小,并且看到良好的进度值会让人感觉更快。
因此,要定期更新进度,请执行以下操作:
final long count = 1_000_000_000L;
long nextTime = 0;
for (long i = 0; i < count; i++) {
long time = System.currentTimeMillis();
if (time >= nextTime) {
System.out.printf("%.2f%%\r", i * 100d / count);
nextTime = time + 200;
}
// slowMethod();
}
System.out.println("100.00%");
Run Code Online (Sandbox Code Playgroud)
由于我没有“slowMethod”,我只是将迭代计数增加到足够慢才能看到进度。
该200
值意味着它将每 200 毫秒打印一次进度,即每秒 5 次。如果您认为太多,可以增加该值,但我喜欢它。
使用打印进度\r
意味着进度在一行上更新。如果从 Windows 命令提示符运行,则效果很好,但 IDE(例如 Eclipse)可能只是将其视为换行符,在控制台窗格中的新行上打印每个进度更新,在这种情况下,频繁更新不太可取。