Como se sugiere por otros, System.currentTimeMillis()
es bastante bueno, pero tenga en cuenta las siguientes salvedades:
System.currentTimeMillis()
medidas transcurrido el tiempo físico ("tiempo de reloj de pared"), no el tiempo de CPU. Si se están ejecutando otras aplicaciones en la máquina, su código obtendrá menos CPU y su velocidad disminuirá. Por lo tanto, use bench solo en sistemas inactivos.
- Del mismo modo, una aplicación de subprocesos múltiples en un sistema multinúcleo puede obtener CPU oculta adicional. La medida del tiempo transcurrido no captura la totalidad de la complejidad de las aplicaciones de subprocesos múltiples.
- Java necesita un poco de "calentamiento". La VM primero interpretará el código (que es lento) y, si un método dado se usa muchas veces, el compilador JIT traducirá el método a código nativo. Solo en ese punto el método alcanzará su velocidad máxima. Recomiendo que realice algunos "bucles vacíos" antes de llamar al
System.currentTimeMillis()
.
- La precisión de
System.currentTimeMillis()
es raramente de 1 ms. En muchos sistemas, la precisión no es mejor que 10 ms o incluso más. Además, la JVM algunas veces ejecutará el GC e inducirá pausas notables. Sugiero que organices tu medida en un ciclo e insistas en correr durante al menos unos segundos.
Esto produce el siguiente código:
for (int i = 0; i < 10; i ++) {
runMethod();
}
int count = 10;
for (;;) {
long begin = System.currentTimeMillis();
for (int i = 0; i < count; i ++)
runMethod();
long end = System.currentTimeMillis();
if ((end - begin) < 10000) {
count *= 2;
continue;
}
reportElapsedTime((double)(end - begin)/count);
}
Como se puede ver, hay diez primeras carreras "vacías". Luego el programa ejecuta el método en un bucle, tantas veces como sea necesario para que el bucle tome al menos diez segundos. Diez segundos deberían ser suficientes para suavizar las ejecuciones de GC y otras imprecisiones del sistema. Cuando realizo implementaciones de funciones hash de banco, uso dos segundos, y aunque la función en sí no desencadena ninguna asignación de memoria, sigo obteniendo variaciones de hasta un 3%.
No relacionado con la pregunta principal, pero tal vez de interés dado que planea escribir software para resolver Sudoku. Eche un vistazo a la solución de Norvig. http://norvig.com/sudoku.html – hashable
+1 gracias, sí. Conozco esta solución. Buenas cosas –