Estaba practicando una solución de Javascript para un problema de lista vinculada (invertir una lista vinculada) cuando observé lo siguiente. Cuando mi código contenía este fragmento:
while(head!=null) { temp = head.next head.next = prev prev = head head = temp }Esto tomó 96 ms y unos 43,6 MB.
Era correcto pero ni siquiera en el 50% superior con respecto a la velocidad, por lo que decidí omitir al azar la parte !=null de la instrucción if para ver qué sucede.
while(head) { temp = head.next head.next = prev prev = head head = temp }Para mi sorpresa, ¡esto redujo el tiempo a 63ms y lo colocó más rápido que el 96% de las soluciones! La memoria tomada también aumentó ligeramente a 44,2 MB. Pero estoy confundido en cuanto a por qué este simple cambio causó una aceleración tan drástica.
Si tuviera que adivinar, diría que el segundo escenario simplemente verifica si existe head , mientras que el primer escenario en realidad evalúa head first y luego lo compara explícitamente con null , o algo así. Incluso si esto es correcto, estoy sorprendido por la mejora de la velocidad. ¿Alguna idea sobre esto?
Editar: En una sugerencia en los comentarios, también probé (head !== null) , que a los 64 ms fue definitivamente más rápido que el primer escenario, ¡pero igual que el segundo!