Tengo este programa Java que utilizo para atrapar varios terabytes de datos. El rendimiento es una preocupación.¿Norma eficiente en Java?
que he perfilado de la aplicación, y una gran parte de todas las asignaciones de memoria, así como una gran fracción de tiempo de CPU provenir de la ejecución de una operación simple:
tengo una serie de caracteres ASCII. Sé que los caracteres del desplazamiento i
para compensar j
representan un número de coma flotante. Necesito extraer ese número de coma flotante en un double
.
La ingenua Double.parseDouble(new String(buf, i, j - i))
hace el trabajo. Sin embargo, aquí es donde se gasta mucho tiempo y una gran cantidad de asignaciones de memoria viene, probablemente porque:
new String()
crea un nuevo objeto, crea una matriz internachar[]
y copia los caracteres en la matriz;Double.parseDouble()
crea un objetoFloatingDecimal
, y también crea una matrizchar[]
, también copiar los caracteres en ella.
Todas estas asignaciones y todas estas copias no son realmente necesarias. ¿Puedo evitarlos?
Lo que realmente me gustaría es una función strtod
-como que tomaría un char[]
(o una byte[]
), así como las compensaciones de inicio/final, y devolver una double
.
¿Alguna sugerencia? ¿Debería lanzar el mío? ¿Debo escribir un contenedor JNI alrededor del strtod
? ¿Debería usar alguna biblioteca Java que ya esté disponible?
En realidad, el método String.substring no copia el arreglo inicial. Puede ser útil si el constructor de cadenas es un cuello de botella. –