2012-07-07 18 views
9

Con el fin de conseguir la transferencia más rápida de las velocidades a través de TCP en Java, que es mejor:Enchufes: BufferedOutputStream o simplemente OutputStream?

Opción A:

InputStream in = socket.getInputStream(); 
OutputStream out = socket.getOutputStream(); 

Opción B:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream()); 
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 

He leído que el rendimiento necesario un éxito al escribir más de 8 KiB en OutputStream, se recomendó que se escribiera en pequeños trozos que no se escriben 8 KiB a la vez. 8 KiB es el tamaño de búfer predeterminado de un BufferedOutputStream.

Sin embargo, también he leído que al transferir datos a través de la red es bueno eliminar los bytes lo más rápido posible. Lo que significa que usar un búfer y escribir en pequeños fragmentos agrega una sobrecarga innecesaria.

Entonces, la opción A o la opción B? ¿Cuál funciona mejor?

En este momento supongo que la opción A proporciona las velocidades de transferencia más altas y consume mucha más CPU que la opción B. La opción B podría ser mejor, ya que no es mucho más lenta pero ahorra mucha CPU.

-

Bono pregunta: ¿Es una buena idea para tocar el tamaño de la ventana TCP? Por ejemplo estableciéndola en 64 KiB:

socket.setReceiveBufferSize(65536); 
socket.setSendBufferSize(65536); 

He intentado ajustarlo a 128 KiB en una máquina de prueba desde que leí que podría aumentar las velocidades pero cuando el servidor tiene un par de conexiones de la CPU estuviera al 100% en lugar de ~ 2% como cuando lo dejé solo. Supongo que 128 KiB es demasiado alto a menos que tengas un buen servidor que pueda manejar esa prisa en el tráfico, pero ¿es inteligente establecerlo en algo así como 32 KiB? Creo que el valor predeterminado fue 8 KiB para mí.

("socket" es "java.net.Socket")

Respuesta

6

No sé donde se lee todas esas tonterías, pero es completamente al revés. Cuanto más escribes a la vez a una conexión TCP, mejor y más lo lees a la vez. Siempre usaré una secuencia de almacenamiento en búfer, lector o escritor entre la aplicación y las secuencias de socket. Hay algunos casos como SSL donde escribir directamente un byte a la vez puede causar una explosión de datos de 40x.

¿Es una buena idea tocar el tamaño de la ventana TCP? Por ejemplo, configurándolo en 64 KiB

No puede "tocar el tamaño de la ventana TCP". Puede aumentar su valor máximo a través de las API que menciona, y esa es una buena idea.

+0

El uso del núcleo OutputStream y InputStream no lo obliga a escribir bytes uno por uno. ¿Qué pasa con la escritura de matrices de bytes usando estas clases en comparación con el almacenamiento en búfer? – Mishax

0

¿Qué quiere decir velocidad? baja latencia o alto rendimiento?

Para una latencia baja, enjuague la secuencia tan pronto como termine de escribir en ella.

Para obtener un alto rendimiento, utilice un flujo de almacenamiento intermedio y permita que el VM/OS maneje su enjuague.