원래, 나는이 코드를 가지고 있었다 :
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));
}
}
내 컴퓨터에서 중첩 된 for 루프를 실행하는 데 약 4 초가 걸리며 왜 그렇게 오래 걸 렸는지 이해할 수 없습니다. 외부 루프는 100,000 번 실행되고 내부 for 루프는 1 번 실행되어야합니다 (hashSet의 값이 -1이 아니기 때문에). HashSet에서 항목 제거가 O (1)이므로 약 200,000 개의 작업이 있어야합니다. 일반적으로 초당 100,000,000 개의 작업이있는 경우 코드를 실행하는 데 어떻게 4 초가 걸립니까?
또한 라인 hashSet.remove(i);
이 주석 처리 된 경우 코드는 16ms 만 걸립니다. 내부 for 루프가 주석 처리 된 경우 (주석이 아닌 경우 hashSet.remove(i);
) 코드는 8ms 만 걸립니다.
for val
루프는 시간을 복용 것입니다. 는 remove
매우 빠른 아직도있다. 세트가 수정 된 후 새로운 반복자를 설정하는 일종의 오버 헤드 ...?
for val
루프가 느린 이유에 대한 좋은 설명을 제공했습니다 . 그러나 루프가 전혀 필요하지 않습니다. 세트에 -1과 다른 값이 있는지 확인하려면 검사하는 것이 훨씬 효율적 hashSet.size() > 1 || !hashSet.contains(-1)
입니다.