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

时间:2012-02-09 21:06:50

标签: windows delphi indy

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

当我使用大约每秒1兆(8兆位)的数据时,一切正常。

然而,当我以20megs / sec(160兆位)的速度设置我的数据时,它会变慢并开始表现得很奇怪。

这是那种速度的通常行为吗? 此外,我似乎无法找到任何基准或信息,表明2本地应用程序之间的最大数据传输速度。

此致

3 个答案:

答案 0 :(得分:4)

执行带宽测试。这就是我使用的(我附加了相关的服务器和客户端代码)。 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;

答案 1 :(得分:2)

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

  • 命名或未命名的管道
  • 虚拟内存映射
  • 传递WM_DATA消息
  • COM
  • (随意添加更多你发现他们应该在这里列出)

答案 2 :(得分:0)

没有任何代码可以重现问题,很难找到问题所在。

IP通信在本地非常稳定(所有数据都保留在内存中,在OS缓冲区中) - 对于现在的HW / SW,20 MB / s并不是带宽速度。

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

当然,您是否尝试禁用AntiVirus数据包检查?其中一些在检查IP数据包时会大大减慢IP流量(即使它不是HTTP),并且会导致这种随机的IP流量堵塞。