Я хочу создать сервер / клиент C ++, который максимизирует пропускную способность по сравнению с TCP-сокетом на моем локальном хосте.В качестве подготовки я использовал iperf , чтобы узнать максимальную пропускную способность моего i7 MacBookPro.
------------------------------------------------------------
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,2 Гбит/ с.Затем я сделал свою собственную реализацию C ++ сервера / клиента, вы можете найти полный код здесь: https://gist.github.com/1116635
В этом коде я в основном передаю массив размером 1024 байта с каждой операцией чтения / записи.Так что мой цикл отправки на сервере выглядит следующим образом:
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 Гбит / с:
./client 127.0.0.1 1234
Elapsed time for Reading 4GigaBytes of data over socket on localhost: 9578ms
Где я теряю пропускную способность, что я делаю неправильно?Опять же, полный код можно увидеть здесь: https://gist.github.com/1116635
Любая помощь приветствуется!