jvm almacenamiento en caché de llamadas a métodos?

Estoy haciendo unas pruebas de rendimiento de un stripper HTML (escrito en java), es decir, le paso una cadena (en realidad contenido html) a un método del stripper HTML y este último devuelve texto plano (sin etiquetas HTML ni metainformación ).

Aquí hay un ejemplo de la implementación concreta.

public void performanceTest() throws IOException {
    long totalTime;
    File file = new File("/directory/to/ten/different/htmlFiles");
    for (int i = 0; i < 200; ++i) {
        for (File fileEntry : file.listFiles()) {

            HtmlStripper stripper = new HtmlStripper();
            URL url = fileEntry.toURI().toURL();
            InputStream inputStream = url.openStream();
            String html = IOUtils.toString(inputStream, "UTF-8");
            long start = System.currentTimeMillis();
            String text = stripper.getText(html);
            long end = System.currentTimeMillis();
            totalTime = totalTime + (end - start);

      //The duration for the stripping of each file is computed here
     // (200 times for each time). That duration value decreases and then becomes constant
     //IMHO if the duration for the same file should always remain the same.
     //Or is a cache technique used by the JVM?         


        System.out.println("time needed for stripping current file: "+ (end -start));
        }
    }
    System.out.println("Average time for one document: "
            + (totalTime / 2000));

}

Pero la duración de la eliminación de cada archivo se calcula 200 veces por cada vez y tiene un valor decreciente diferente. En mi humilde opinión, si la duración de uno y el mismo archivo X debe permanecer siempre igual!? ¿O es una técnica de caché utilizada por la JVM?

Cualquier ayuda sería apreciada. Gracias por adelantado

Horace

NB: - Estoy haciendo las pruebas locales (NO remotas, NO http) en mi máquina. - Estoy usando java 6 en Ubuntu 10.04

preguntado el 03 de mayo de 12 a las 17:05

2 Respuestas

Esto es totalmente normal. El JIT compila métodos en código nativo y los optimiza más a medida que se usan cada vez más. (La "constante" a la que eventualmente converge su punto de referencia es el pico de las capacidades de optimización del JIT).

Usted podrá obtenga buenos puntos de referencia en Java sin ejecutar el método muchas veces antes empiezas a cronometrar en absoluto.

contestado el 03 de mayo de 12 a las 17:05

Podría agregar aquí que marcos de microbenchmarking como Calibrador de Google existen para ayudar a hacer ese tipo de inicialización por usted, pero aún debe ser inteligente al escribir el punto de referencia en sí. Caliper en sí todavía está un poco crudo, pero lo he encontrado bastante útil. Estoy seguro de que también existen otros marcos de referencia. - kevin welker

FYI, Caliper se está preparando para un lanzamiento de srs bsns en un futuro no muy lejano. - Luis Wassermann

Muchas gracias chicos. Eso explica todo :-) - Horace

Gracias Louis. La misma respuesta tuya me salvó el día hace algunos meses :-) - Horace

En mi humilde opinión, si la duración de un mismo archivo X siempre debe ser la misma

No en presencia de un compilador optimizador justo a tiempo. Entre otras cosas, realiza un seguimiento de cuántas veces se usa un método/rama en particular y compila selectivamente los códigos de bytes de Java en código nativo.

contestado el 03 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.