同一台计算机上两个应用程序之间的最大数据/速度传输是多少



我有一个用delphiXe2编写的客户端/服务器应用程序,使用Indy TIdTCPServer和TIdTCPClient,它们在同一台计算机上使用TCP地址127.0.0.1 相互通信

当我使用大约每秒1兆(8兆比特)的数据时,一切都很好。

然而,当将我的数据设置为20英里/秒(160兆比特)的更高速度时,它会变慢,并开始表现得很奇怪。

这种速度是正常的行为吗?此外,我似乎找不到任何关于2个本地应用程序之间的最大数据传输速度的基准或信息。

问候

执行带宽测试。这就是我使用的(我已经附上了相关的服务器和客户端代码)。FWIW,我的最大速度约为500Mbps,尽管我不可能这么快处理数据。

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;

如果您(ab)使用TCP/IP作为在设计为在同一台机器上运行的进程之间进行IPC的手段,您将遇到这样的限制。通过使用TCP/IP,特别是本地连接,所有数据都被分段并通过TCP数据包交换系统推送。如果是这种情况,你应该看看其中一个:

  • 命名或未命名管道
  • 虚拟内存映射
  • 四处传递WM_DATA消息
  • COM
  • (请随意添加更多您认为值得在此处列出的内容)

如果没有任何代码来重现问题,很难找到问题。

IP通信在本地非常稳定(所有数据都保留在内存和操作系统缓冲区中),对于当今硬件/软件的带宽速度来说,20 MB/s根本算不上什么。

我想问题出在你的代码中,或者你达到了Delphi的(多线程?)限制,在处理数据时受到了挫折。

当然,你有没有尝试禁用反病毒数据包检查?其中一些在检查IP数据包时会大大降低IP流量(即使不是HTTP),这会导致这种随机的IP流量堵塞。

最新更新