Entonces, originalmente, tenía este código:
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));
}
}
Se necesitan alrededor de 4 segundos para ejecutar los bucles anidados en mi computadora y no entiendo por qué tardó tanto. El bucle externo se ejecuta 100,000 veces, el bucle interno debe ejecutarse 1 vez (porque cualquier valor de hashSet nunca será -1) y la eliminación de un elemento de un HashSet es O (1), por lo que debería haber alrededor de 200,000 operaciones. Si normalmente hay 100,000,000 operaciones en un segundo, ¿cómo es que mi código tarda 4 segundos en ejecutarse?
Además, si la línea hashSet.remove(i);
está comentada, el código solo tarda 16 ms. Si el bucle for interno está comentado (pero no hashSet.remove(i);
), el código solo tarda 8 ms.
for val
ciclo es lo que toma el tiempo. El remove
sigue siendo muy rápido. ¿Algún tipo de sobrecarga configurando un nuevo iterador después de que el conjunto ha sido modificado ...?
for val
ciclo es lento. Sin embargo, tenga en cuenta que el bucle no es necesario en absoluto. Si desea verificar si hay valores diferentes de -1 en el conjunto, sería mucho más eficiente verificar hashSet.size() > 1 || !hashSet.contains(-1)
.