2010-02-19 3 views
4

Я попытался отправить/получить данные с помощью TcpClient. Я сделал два эксперимента и нашел что-то интересное.Создает ли TcpClient много накладных расходов?

Я настраиваю TcpListener на сервер в Японии и TcpClient в Великобритании. Я продолжал отправлять 500 байтов в TcpListener, и когда TcpListener отправляет 10 КБ обратно в TcpClient. Я сохранял этот цикл отправки/получения 500 раз в каждом эксперименте.

Эксперимент 1:

В каждой отправить/получить петлю, создать совершенно новый TcpClient (время тикает от только до создания) и отправить/получить

Эксперимент 2:

Для все циклы, у меня есть только один TcpClient, и он поддерживает соединение с TcpListener и делает send/receive 500 раз.

Результат:

Среднее значение стоимости времени в течение одного цикла:

E1: 1,8 секунды, Е2: 0,49 сек.

Я очень удивлен этим результатом. Поэтому сохранение связи для постоянной отправки/получения может сэкономить много времени ??? почти 2/3 времени.

Это правда ???

Благодаря

==== ==== нового

тарелочки @ Джон, @dbemerlin, спасибо за ответ. Я догадался, что рукопожатия Tcp занимают некоторое время.

Так что я сделал эксперимент 3.

I настроить HttpListener в качестве сервера и использовать WebClient для отправки/приема, размеры данных точно так же. И каждый раз, когда я использовал новый WebClient для отправки/получения между Великобританией и Японией.

Результат: 0,86 (среднее от 500 раз, т. Е. Отправление/получение).

Я предполагаю, что сами WebClient/HttpLisener являются Tcp, правильно? Как они могут быть быстрее, чем сырые TcpClient/TcpListener в моих экспериментах?

Еще раз спасибо

+0

Либо ваш веб-клиент оставляет соединение открытым и/или использует конвейерную обработку, либо классы TcpClient/TcpListener работают медленно и не используются для классов HttpListener/WebClient, но это маловероятно, так как Microsoft (против всех слухов) делает неплохую работу , Используйте Wireshark, чтобы проверить, что на самом деле происходит между Великобританией и Японией. Кроме того: сетевые соединения (особенно далеко) склонны к разной скорости соединения в зависимости от времени суток, поэтому убедитесь, что вы повторите предыдущие эксперименты. – dbemerlin

ответ

6

Это не особенно удивительно, но это не стоимость создания объекта - это стоимость установления соединения TCP, рукопожатия и т.д.

Если вы можете сделать много работы над одним соединением, это более эффективно, чем создание нового соединения каждый раз. Чтобы выразить это в реальных условиях, рассмотрите телефонный разговор между двумя людьми.

Эффективный сценарий: вы набираете номер, они подбирают, вы говорите, они отвечают, вы говорите, они отвечают и т.д.

Неэффективного сценарий: вы набираете numebr, они поднимают, вы говорите, они отвечают , вы повесили трубку. Затем вы сразу же набираете номер снова, они забирают, вы говорите, они отвечают, вы вешаете трубку и т. Д.

Представьте, что делать последнее на самом деле! Вы бы сходили с ума очень быстро ...

EDIT: По умолчанию WebClient оставит висящее соединение открытым для веб-сервера. Если вы принудительно сбросите соединения (в основном отключите KeepAlive), вы снова увидите медленное поведение.

+0

новый эксперимент добавлен. спасибо – Jack

+0

Я не вижу никаких свойств в WebClient для KeepAlive. Могу ли я отключить его и повторить попытку? – Jack

1

Для каждого соединения TCP требуется рукопожатие, когда оно создано (с трехсторонним рукопожатием, не уверен atm), что означает, что даже если данные не отправлены, пакет отправляется на цель, другой отправляется обратно и - если это трехстороннее рукопожатие - третий отправляется в цель.

Пакет отправляется из Великобритании в Японию, предположим, 100 мс. Это означает, что каждый «tcpClient.Connect()» требует 300 мс без отправки каких-либо данных. Ваша нормальная отправка & получает один пакет, отправленный в пункт назначения, а другой обратно, требующий в общей сложности 200 мс. Выключение (если оно чистое) требует еще 100 мс.

Это приводит к 600 мс для отправки сообщения по сравнению с 200 мс, если вы поддерживаете соединение, так как вы сохраните рукопожатие и завершение работы.

+0

новый эксперимент добавлен. благодаря – Jack

Смежные вопросы