Pregunta

He intentado enviar / recibir datos mediante el uso de TcpClient. Hice dos experimentos y encontré algo interesante.

I fijó la TcpListener en un servidor en Japón y los TcpClient en el Reino Unido. Seguí el envío de 500 bytes al TcpListener y cuando TcpListener envía de vuelta a la 10KB TcpClient. Guardé este enviar / recibir bucle de 500 veces en cada experimento.

Experimento 1:

En cada envío / recepción de bucle, que crear una marca nueva TcpClient (el tiempo de garrapatas justo antes de la creación) y envío / recepción

Experimento 2:

Para todos los bucles, sólo tengo una TcpClient, y se mantiene la conexión con TcpListener y hago de envío / recepción de 500 veces.

Resultados:

El valor promedio del costo de tiempo para un bucle:

E1: 1,8 segundos, E2:. 0,49 segundos

Estoy bastante sorprendido por este resultado. Por lo que mantener la conexión para enviar constante / recepción que puede ahorrar un montón de tiempo ??? casi 2/3 del tiempo.

Es esto cierto ???

Gracias

==== ==== nueva

@ Jon Skeet, @dbemerlin, Gracias por la respuesta. Supuse los apretones de manos Tcp toman alguna herramienta de tiempo.

Así que hice el experimento 3.

I fijó un HttpListener como el servidor y utilizar un cliente Web para enviar / recibir, los tamaños de los datos son exactamente los mismos. Y cada vez que utiliza un nuevo cliente Web para enviar / recibir entre el Reino Unido y Japón.

El resultado es 0,86 (promedio de 500 veces de bucle, es decir, enviar / recibir).

Asumo que WebClient / HttpLisener mismos son TCP, ¿verdad? ¿Cómo pueden ser más rápido que prima TcpClient / TcpListener en mis experimentos ??

Gracias de nuevo

¿Fue útil?

Solución

Esto no es particularmente sorprendente, pero no es el costo de crear el objeto -. Que es el costo de establecer una conexión TCP, con un apretón de manos, etc.

Si usted puede hacer un montón de trabajo a través de una sola conexión, que es más eficiente que la creación de una nueva conexión cada vez. Para ponerlo en términos del mundo real, considere la posibilidad de una conversación telefónica entre dos personas.

escenario eficiente:. De marcar el número, recogen, se habla, ellos responden, se habla, ellos responden, etc.

escenario ineficiente: marcar el numebr, recogen, se habla, ellos responden, de colgar. A continuación, marcar el número inmediatamente de nuevo, que recogen, se habla, ellos responden, de colgar, etc.

Imagine que está haciendo este último en la realidad! Se podría volverse loco muy rápidamente ...

EDIT: Por defecto, WebClient dejará una conexión abierta a colgar el servidor web. Si se obliga a las conexiones que se restablezca (básicamente desactivar KeepAlive) y luego verá el comportamiento lento de nuevo.

Otros consejos

Cada conexión TCP requiere un apretón de manos cuando se crea (afair tres vías-apretón de manos, no estoy seguro atm) lo que significa que incluso si no se envían datos todavía un paquete se envía a la meta, otro se envía de nuevo y - si se trata de un apretón de manos de tres vías -. un tercero se envía al destino

Un paquete viaja desde el Reino Unido a Japón en, supongamos, 100 ms. Esto significa que cada "tcpClient.Connect ()" requiere 300ms sin ningún envían datos. Su envío y recepción de lo normal se compone de un paquete enviado al destino y otro hacia atrás, lo que requiere un total de 200 ms. Apagado (si se trata de una limpia) requiere otros 100 ms.

Este resultado en 600 ms para enviar el mensaje, en comparación con 200 ms si se mantiene la conexión a medida que guardará entonces el apretón de manos y apagado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top