ローカルホストでTCPソケット通信のスループットを最大化するC++サーバー/クライアントを作成したいと思います。準備として、iperfを使用して、i7MacBookProの最大帯域幅を調べました。
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 256 KByte (default)
------------------------------------------------------------
[ 4] local 127.0.0.1 port 5001 connected with 127.0.0.1 port 51583
[ 4] 0.0-120.0 sec 329 GBytes 23.6 Gbits/sec
微調整なしで、iprefは私が少なくとも23.2GBit/秒に達することができることを私に示しました。次に、独自のC ++サーバー/クライアント実装を行いました。完全なコードはここにあります:https ://gist.github.com/1116635
そのコードは、基本的に、読み取り/書き込み操作ごとに1024バイトのint配列を転送します。したがって、サーバー上の送信ループは次のようになります。
int n;
int x[256];
//fill int array
for (int i=0;i<256;i++)
{
x[i]=i;
}
for (int i=0;i<(4*1024*1024);i++)
{
n = write(sock,x,sizeof(x));
if (n < 0) error("ERROR writing to socket");
}
クライアントでの受信ループは次のようになります。
int x[256];
for (int i=0;i<(4*1024*1024);i++)
{
n = read(sockfd,x,((sizeof(int)*256)));
if (n < 0) error("ERROR reading from socket");
}
見出しで述べたように、これを実行すると(-O3でコンパイル)、実行時間は約3 GBit/sになります。
./client 127.0.0.1 1234
Elapsed time for Reading 4GigaBytes of data over socket on localhost: 9578ms
どこで帯域幅を失うのですか、何が間違っているのですか?繰り返しになりますが、完全なコードはここで見ることができます:https ://gist.github.com/1116635
どんな助けでも大歓迎です!