2011-06-13 12 views
10

Necesito una clase de buffer byte en Java para uso de un solo subproceso. El búfer debe cambiar de tamaño cuando está lleno, en lugar de arrojar una excepción o algo. Un tema muy importante para mí es el rendimiento.¿Cuál es el mejor búfer de bytes redimensionable disponible en Java?

¿Qué recomendarías?

AGREGADO: En el momento en que uso ByteBuffer pero no puede cambiar el tamaño. Necesito uno que pueda cambiar el tamaño.

+0

Nota al margen: Microbenchmarking y notas sobre los búfers de byte: http://www.evanjones.ca/software/java-bytebuffers.html – miku

+0

cómo se compara el rendimiento y el uso de un único subproceso, un byte normal [] supera cualquier cosa fácilmente. – bestsss

+1

no puedo usar byte [] porque no conozco la longitud de los datos que tengo que escribir. – Worker

Respuesta

9

¿Alguna razón para no utilizar el aburrido normal ByteArrayOutputStream?

Según lo mencionado por miku anteriormente, Evan Jones gives a review of different types y muestra que es muy dependiente de la aplicación. Entonces, sin saber más detalles, es difícil especular.

Comenzaría con ByteArrayOutputStream, y solo si los perfiles muestran que es su cuello de botella de rendimiento se mueven a otra cosa. A menudo, cuando crees que el código del búfer es el cuello de botella, en realidad será una red u otro IO: espera hasta que el perfil demuestre que necesitas una optimización antes de perder tiempo encontrando un reemplazo.

Si se está mudando a otra cosa, a continuación, otros factores que tendrán que pensar:

  • Usted ha dicho que está utilizando el uso de un solo subproceso, por lo que no es necesaria la sincronización de BAÑOS
  • lo que es el ¿Se está llenando y alimentando el búfer? Si alguno de los extremos ya está conectado para usar Java NIO, entonces usar un ByteBuffer directo es muy eficiente.
  • ¿Está utilizando un búfer circular o un búfer lineal simple? Si usted es entonces el Ostermiller Utils es bastante eficiente, y GPL'd
+0

está lejos de ser el mejor – bestsss

+0

está sincronizado, podría tener algún impacto en el rendimiento. – Worker

+0

@MinimeDJ - No estoy seguro de lo que está haciendo, pero "podría haber algún impacto en el rendimiento" está muy lejos de "hay un problema de rendimiento". –

2

Puede utilizar un ByteBuffer directo. La memoria directa usa memoria virtual para comenzar solo se asigna a la aplicación cuando se usa. es decir, la cantidad de memoria principal que utiliza vuelve a clasificar según tamaño automágicamente.

Crea un ByteBuffer directo más grande de lo que necesitas y solo consumirá lo que usas.

+0

nice one, automágicamente para fallas de página: D pero la cantidad de memoria directa es limitada (sin embargo, puede establecerse lo suficientemente alta). Los DirectByteBuffers deben agruparse porque son bastante caros de asignar y especialmente de desasignar. – bestsss

2

También puede escribir código manual para verificar continuamente el contenido del búfer y, si está lleno, cree un nuevo búfer de mayor tamaño y cambie todos los datos en ese búfer nuevo.

Cuestiones relacionadas