Какова максимальная скорость передачи данных / данных между двумя приложениями на одном компьютере? - PullRequest
6 голосов
/ 10 февраля 2012

У меня есть клиент-серверное приложение, написанное на delphiXe2 с использованием Indy TIdTCPServer и TIdTCPClient, которое связывается друг с другом на одном компьютере с использованием TCP-адреса 127.0.0.1

Когда я использую примерно 1 мегабит в секунду (8 мегабит) данных все работает нормально.

Однако, когда мои данные устанавливаются на более высокой скорости, например 20 мегабит / сек (160 мегабит), они замедляются и начинают странно себя вести.

Это обычное поведениеза эту скорость?Также я не могу найти какой-либо тест или информацию о том, какова максимальная скорость передачи данных между двумя локальными приложениями.

С уважением

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Выполните тест пропускной способности. Это то, что я использую (я приложил соответствующий сервер и код клиента). Впрочем, я получаю максимум около 500 Мбит / с, хотя я не могу обработать данные так быстро.

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  lData: TByteDynArray;
  lCaption: string;
  lMbps: Real;
  lLen: Integer;
begin
  AContext.Connection.IoHandler.CheckForDataOnSource;
  SetLength(lData, 0);
  AContext.Connection.IoHandler.InputBuffer.ExtractToBytes(TIdBytes(lData),
                                     AContext.Connection.IoHandler.InputBuffer.Size);
  lLen := Length(lData);
  if lLen > 0 then begin
    if FStartTime = 0 then begin
      Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', CsiNow) +': Started test');
      FStartTime := CsiNow;
    end;
    Inc(FBytesReceived, lLen);
    lCaption := 'MBits Received: ' + CsiPadFloat(FBytesReceived * 1.0 / 125000, 3, 1);
    if lCaption <> FLastCaption  then begin
      Label1.Caption := lCaption;
      FLastCaption := lCaption;
    end;
    if FBytesReceived >= 12500000 then begin
      FStopTime := CsiNow;
      lMbps := 100000 / MilliSecondsBetween(FStopTime, FStartTime);
      Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz', CsiNow) +
                      ': Finished test (' + CsiPadFloat(lMbps, 3, 1) + ' Mbps)');
      FBytesReceived := 0;
      FStartTime := 0;
    end
  end;

  CsiSleep(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  lData: TByteDynArray;
  lIndex: Integer;
begin
  IdTCPClient1.Host := Edit1.Text;
  IdTCPClient1.Connect;
  try
    SetLength(lData, 125000);
    for lIndex := 1 to 125000 do
      lData[lIndex - 1] := Ord('a');
    for lIndex := 1 to 100 do
      IdTCPClient1.IoHandler.Write(TIdBytes(lData));
  finally
    IdTCPClient1.Disconnect;
  end;
end;
2 голосов
/ 10 февраля 2012

Если вы (ab) используете TCP / IP в качестве средства для выполнения IPC между процессами, предназначенными для работы на одной и той же машине, вы столкнетесь с такими ограничениями. Используя TCP / IP, особенно локальное соединение, все данные фрагментируются и проталкиваются через систему коммутации пакетов, которая является TCP. Если это так, вы должны посмотреть на один из них:

  • Именованные или безымянные каналы
  • Отображение виртуальной памяти
  • Передача сообщений WM_DATA вокруг
  • COM
  • (не стесняйтесь добавлять больше из вас, они считают, что они заслуживают перечисления здесь)
0 голосов
/ 10 февраля 2012

Без какого-либо кода, воспроизводящего проблему, очень трудно найти проблему.

Локальная IP-связь очень стабильна (все данные остаются в памяти, в буферах ОС) - и 20 МБ / с - ничто для пропускной способности в современных HW / SW.

Я полагаю, что проблема в вашем коде, или вы достигли (многопоточности) ограничений Delphi, и получили затруднения при обработке данных.

Конечно, вы пытались отключить проверку пакетов Антивируса? Некоторые из них сильно замедляют IP-трафик при проверке IP-пакетов (даже если это не HTTP), и это приводит к такому случайному застреванию IP-трафика.

...