4

TcpClientを使ってデータの送受信を試みました。私は2つの実験を行い、何か面白いものを見つけました。

日本のサーバーにTcpListenerをセットアップし、英国のサーバーにTcpClientをセットアップしました。TcpListenerに500バイトを送信し続け、TcpListenerが10KBをTcpClientに送り返すとき。この送信/受信ループを各実験で500回維持しました。

実験1:

すべての送受信ループで、新しいTcpClientを作成し(作成直前から時間が刻みます)、送受信します

実験2:

すべてのループで、TcpClientは1つしかなく、TcpListenerとの接続を維持し、500回の送受信を行います。

結果:

1つのループの時間コストの平均値:

E1:1.8秒、E2:0.49秒。

私はこの結果に非常に驚いています。したがって、一定の送受信のために接続を維持することで、多くの時間を節約できますか?ほぼ2/3の時間。

これは本当ですか???

ありがとう

====新しい====

@ Jon Skeet、@ dbemerlin、返信ありがとうございます。Tcpハンドシェイクには時間がかかると思います。

だから私は実験3をしました。

サーバーとしてHttpListenerを設定し、WebClientを使用して送受信します。データサイズはまったく同じです。そして、新しいWebClientを使用して、英国と日本の間で送受信するたびに。

結果は0.86です(500回のループの平均、つまり送信/受信)。

WebClient / HttpLisener自体はTcpだと思いますよね?私の実験では、生のTcpClient / TcpListenerよりもどのように高速になりますか?

再度、感謝します

4

2 に答える 2

6

これは特に驚くべきことではありませんが、オブジェクトを作成するためのコストではありません。ハンドシェイクなどを使用してTCP接続をセットアップするためのコストです。

1つの接続で多くの作業を実行できる場合は、毎回新しい接続を設定するよりも効率的です。現実の世界で言えば、2人の間の電話での会話を考えてみましょう。

効率的なシナリオ:あなたは番号をダイヤルし、彼らは拾い上げ、あなたは話し、彼らは返答し、あなたは話し、彼らは返答するなど。

非効率的なシナリオ:あなたは数字をダイヤルし、彼らは拾い上げ、あなたは話し、彼らは返答し、あなたは電話を切ります。次に、すぐにもう一度番号をダイヤルすると、相手が電話に出たり、話したり、返信したり、電話を切ったりします。

実際に後者を行うことを想像してみてください!あなたはすぐに夢中になるでしょう...

編集:デフォルトでWebClientは、ハングしている接続をWebサーバーに対して開いたままにします。接続を強制的にリセットする(基本的にキープアライブを無効にする)と、遅い動作が再び表示されます。

于 2010-02-19T13:12:57.933 に答える
1

各TCP接続は、作成時にハンドシェイクを必要とします(公平なスリーウェイハンドシェイク、atmは不明)。つまり、データが送信されていない場合でも、パッケージがターゲットに送信されても​​、別のパッケージが返送されます。スリーウェイの場合はハンドシェイク-3番目のものがターゲットに送信されます。

パッケージは、英国から日本まで100ミリ秒で移動するとします。これは、各「tcpClient.Connect()」がデータを送信せずに300ミリ秒を必要とすることを意味します。通常の送受信は、宛先に送信されたパッケージと返送されたパッケージで構成され、合計200ミリ秒が必要です。シャットダウン(クリーンな場合)には、さらに100ミリ秒かかります。

これにより、メッセージの送信に600ミリ秒かかりますが、接続を維持した場合はハンドシェイクとシャットダウンを保存するため、200ミリ秒になります。

于 2010-02-19T13:15:19.053 に答える