Yani aslında, bu kodu vardı:
import java.util.*;
public class sandbox {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < 100_000; i++) {
hashSet.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100_000; i++) {
for (Integer val : hashSet) {
if (val != -1) break;
}
hashSet.remove(i);
}
System.out.println("time: " + (System.currentTimeMillis() - start));
}
}
Bilgisayarımdaki döngüler için yuvalanmış çalıştırmak yaklaşık 4 s sürer ve neden bu kadar uzun sürdüğünü anlamıyorum. Dış döngü 100.000 kez çalışır, döngü için iç 1 kez çalışmalıdır (hashSet'in değeri hiçbir zaman -1 olmayacaktır) ve bir öğenin HashSet'ten kaldırılması O (1) olduğundan, yaklaşık 200.000 işlem olmalıdır. Saniyede genellikle 100.000.000 işlem varsa, kodum nasıl çalışır?
Ayrıca, satır hashSet.remove(i);
yorumlanırsa kod yalnızca 16 ms sürer. Döngünün içi yorumlanırsa (ancak edilmezse hashSet.remove(i);
), kod yalnızca 8 ms sürer.
for val
Döngü zaman alan bir şey gibi görünüyor . remove
Hala çok hızlı. Set değiştirildikten sonra yeni bir yineleyici kurmak bir tür havai kurulum ...?
for val
döngü yavaştır. Ancak, döngüye hiç gerek olmadığını unutmayın. Sette -1 dışında herhangi bir değer olup olmadığını kontrol etmek istiyorsanız, kontrol etmek çok daha verimli olacaktır hashSet.size() > 1 || !hashSet.contains(-1)
.