jvm almacenamiento en caché de llamadas a métodos?
Frecuentes
Visto 202 veces
1
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
2 Respuestas
4
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
0
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 java jakarta-ee or haz tu propia pregunta.
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