Midiendo el rendimiento de rutinas
Estos días me ha tocado revisar código hecho por otros, y encontré un par de rutinas que me parecieron interesantes para revisar. Estas las publiqué en la cuenta de twitter:
#CodeReviewChallenge
— ☕ Apuntes de Java ☕ 😷🏠 (@apuntesdejava) April 6, 2020
A ver, cómo optimizarían este código (que encontré)? pic.twitter.com/PUWZy0erpG
#CodeReviewChallenge #QuedateEnCasa #StayHome
— ☕ Apuntes de Java ☕ 😷🏠 (@apuntesdejava) April 7, 2020
¿Cómo simplificarían el contenido de este método? (sin usar bibliotecas adicionales) pic.twitter.com/rfRn8Qb2Ga
He recibido respuestas interesantes.
Lo que publicaré en este post y en un vídeo es ver cuál es la rutina más rápida, en base a sus respuestas.
Validando que una lista no esté vacía
He creado una clase
Utils
con tres métodos que validará que una lista no esté vacía. La primera es la manera como encontré en el código, la segunda y la tercera es usando sus respuestas.public static boolean isValidListIf(List<?> list) { if (list != null) { if (list.size() > 0) { return true; } else { return false; } } else { return false; } } public static boolean isValidListInline(List<?> list) { return list != null && !list.isEmpty(); } public static boolean isValidListOptional(List<?> list) { return Optional.ofNullable(list).map((l) -> !l.isEmpty()).orElse(Boolean.FALSE); }¿Cuál cree que es más rápido?
Validando que una cadena no esté vacía
Esta también es similar, solo que se asegura que no tenga espacios en blanco. Igual, tendremos tres métodos:public static boolean isValidStringIf(String str) { if (str != null) { if (str.trim().length() > 0) { return true; } else { return false; } } else { return false; } } public static boolean isValidStringInLine(String str) { return str != null && !str.trim().isEmpty(); } public static boolean isValidStringOption(String str) { return Optional.ofNullable(str).map(s -> !s.trim().isEmpty()).orElse(Boolean.FALSE); }
Vídeo
Aquí veremos el código en ejecución y veremos el resultado, además daremos un veredicto ¿cuál crees que es el resultado?
Código fuente
Aquí publico el código fuente para que también lo intentes y pruebas en tu máquina:
Gracias por el artículo, ¿Pudieras actualizarlo pero ejecutando las pruebas con JMH?. JMH esta bastante bueno y tiene un API que permite configurar los tipos de pruebas. Yo lo estuve usando siguiendo lo documentado aquí http://tutorials.jenkov.com/java-performance/jmh.html
ResponderBorrarHola S8k!
ResponderBorrarDe hecho, hace unos años hice una publicación usando lo que mencionas.
https://www.apuntesdejava.com/2015/12/midiendo-el-rendimiento-con-jmh-java.html
Buenas,
ResponderBorrarMe gustaría añadir a tu foro este aporte.
Para comprobar si una lista es vacía suelo usar la CollectionUtils.
org.apache.commons.collections4.CollectionUtils;
CollectionUtils.isNotEmpty(list) esto te hace la comprobación de null y si es vacía.
Para cadenas uso esta:
StringUtils.isNotBlank(cadena)
Código más limpio y fácil de leer.
Saludos.