Optimización: Llamadas a toByteArray

Hoy analizando código legacy he encontrado decenas de llamadas al método toByteArray de la clase ByteArrayOutputStream, todas en más o menos la siguiente estructura:

ByteArrayOutputStream baos=new ByteArrayOutputStream();
// ... código escribiendo en el byteArrayOutputStream
byte data[]=baos.toByteArray();
// ... código usando esos bytes

Este código es totalmente correcto, pero presenta un fallo de rendimiento interesante, y reside en el hecho de que ByteArrayOutputStream, al obtener los bytes interiores realiza una copia y la devuelve, aquí tenéis el código original de ByteArrayOutputStream.toArray  : 

 public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }

Es decir, que si el ByteArrayOutputStream estaba ocupando 1Mb (porque contuviese un fichero de cierto tamaño, por ejemplo) duplicaremos el espacio ocupado en cuanto hagamos un toByteArray, ¿Qué podemos hacer?

Bueno, como siempre ya hay gente a la que se le ha ocurrido una solución, y es realizar una implementación propia de ByteArrayOutputStream que permita el acceso directo al array de bytes internos, teniendo siempre en cuenta que cualquier cambio que se realice sobre el mismo se reflejará en el contenido del ByteArrayOutputStream (así que mucho ojo). Aquí tenéis un enlace a la implementación existente en Spring en la clase FastByteArrayOutputStream, y podéis incluirla en vuestros proyectos sin necesidad de usar Spring en el mismo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *