Soy nuevo en jmh y en entender lo que sucede detrás de los hilos, etc.
Entonces, comencé a leer y me quedé atascado en la anotación @State y los estados compartidos y no compartidos.
Leí este ejemplo: http://hg.openjdk.java.net/code-tools/jmh/file/ecd9e76155fe/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_03_States.java y tengo algunas preguntas al respecto.
Primera pregunta, ¿cuál es el papel exacto de las clases estatales? para mantener los parámetros? digamos que quiero comparar un programa que encripta una clave de 2 maneras diferentes. ¿Debo mantener la clave (un objeto String) en una clase de estado que anotó con un estado específico? o simplemente mantener el objeto String en la clase de referencia? Una explicación sobre esto sería genial.
Segunda pregunta, ¿por qué en el ejemplo anterior, el rendimiento de la clase estatal no compartida fue mucho mejor que el compartido? ¿Cómo lo cambia el estado multiproceso?
Me siento realmente oscurecido ya que soy nuevo en esto y no pude encontrar ejemplos de "explícame como si tuviera 5" para jmh y sus opciones.
Puede considerar los objetos @State como la parte de su punto de referencia que necesita para ejecutarlos sin que el tiempo para su creación deba considerarse como parte de su tiempo medido.
Digamos que desea medir el tiempo que lleva calcular:
@Benchmark int benchmark() { int foo = 1, bar = 1; return foo + bar; } Desafortunadamente para usted, el compilador JIT es demasiado inteligente para permitirle hacer esto y doblará el método para simplemente devolver 2 . Por supuesto, esto no es lo que quieres medir. Usando el estado, puede escapar de estos valores y dejar que JMH se encargue de no dejar que el JIT doble sus valores. Inicializaría los valores en un método @Setup .
Como otro caso de uso, puede verificar que su punto de referencia hizo lo que esperaba. Esto es posible al validar el estado en un método @TearDown .
Los dos principales beneficios de usar una clase de estado son:
Este artículo explica la clase de estado y los objetos de estado con más detalle: https://www.oracle.com/technical-resources/articles/java/architect-benchmarking.html
Primera pregunta, ¿cuál es el papel exacto de las clases estatales? para mantener los parámetros? digamos que quiero comparar un programa que encripta una clave de 2 maneras diferentes. ¿Debo mantener la clave (un objeto String) en una clase de estado que anotó con un estado específico? o simplemente mantener el objeto String en la clase de referencia? Una explicación sobre esto sería genial.
La clase de referencia también es una clase de estado . Consulte JMHSample_04_DefaultState.java .
Segunda pregunta, ¿por qué en el ejemplo anterior, el rendimiento de la clase estatal no compartida fue mucho mejor que el compartido? ¿Cómo lo cambia el estado multiproceso?
Este es un tema de procesadores “modernos” y no de JMH. Cada núcleo del procesador tiene su propio caché L1 (y quizás L2). Por lo general, no acceden a la RAM directamente. Si varios subprocesos escriben constantemente en la misma área de memoria, el procesador está constantemente ocupado para sincronizar los datos entre todos los núcleos. En realidad, no tiene que acceder a la misma variable para obtener este efecto. Consulte JMHSample_22_FalseSharing.java .