Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 同一台计算机上两个应用程序之间的最大数据/速度传输是多少_Windows_Delphi_Indy - Fatal编程技术网

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

Windows 同一台计算机上两个应用程序之间的最大数据/速度传输是多少,windows,delphi,indy,Windows,Delphi,Indy,我有一个用delphiXe2编写的客户机/服务器应用程序,它使用Indy TIdTCPServer和TIdTCPClient,在同一台计算机上使用TCP地址127.0.0.1相互通信 当我使用每秒1兆(8兆)的数据时,一切正常 然而,当我将数据设置为更高的速度,如20毫秒/秒(160兆比特)时,它会减速并开始表现出奇怪的行为 这是那种速度下的惯常行为吗? 此外,我似乎找不到任何基准测试或2个本地应用程序之间最大数据传输速度的信息 执行带宽测试。这就是我使用的(我附上了相关的服务器和客户端代码)。

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

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

然而,当我将数据设置为更高的速度,如20毫秒/秒(160兆比特)时,它会减速并开始表现出奇怪的行为

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


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

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;
过程TForm1.IdTCPServer1Execute(AContext:TIdContext);
变量
lData:tbyterray;
选项:字符串;
lMbps:真实;
lLen:整数;
开始
AContext.Connection.IoHandler.checkforDataSource;
设置长度(lData,0);
AContext.Connection.IoHandler.InputBuffer.ExtractToBytes(TIdBytes(lData),
AContext.Connection.IoHandler.InputBuffer.Size);
lLen:=长度(lData);
如果lLen>0,则开始
如果FStartTime=0,则开始
Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz',CsiNow)+':startedtest');
FStartTime:=CsiNow;
结束;
公司(FBytesReceived,lLen);
l选项:=“接收到的MBits:”+CsiPadFloat(接收到的FBytesReceived*1.0/125000,3,1);
如果选择FLastCaption,则开始
标签1.标题:=L选项;
FLastCaption:=lcoption;
结束;
如果fBytes接收>=12500000,则开始
FStopTime:=CsiNow;
lMbps:=100000/毫秒(FStopTime,FStartTime);
Memo1.Lines.Add(FormatDateTime('dd/mm/yyyy hh:nn:ss.zzz',CsiNow)+
“:完成测试(“+CsiPadFloat(lMbps,3,1)+”Mbps)”;
fBytes接收:=0;
FStartTime:=0;
结束
结束;
睡眠(0);
结束;
程序TForm1.按钮1单击(发送方:TObject);
变量
lData:tbyterray;
lIndex:整数;
开始
IdTCPClient1.Host:=Edit1.Text;
IdTCPClient1.Connect;
尝试
设定长度(lData,125000);
对于lIndex:=1至125000 do
lData[lIndex-1]:=Ord('a');
对于lIndex:=1到100 do
IdTCPClient1.IoHandler.Write(TIdBytes(lData));
最后
IdTCPClient1.断开连接;
结束;
结束;
如果您(ab)使用TCP/IP作为在设计为在同一台机器上运行的进程之间执行IPC的方法,您将遇到如下限制。通过使用TCP/IP,尤其是本地连接,所有数据都会被分割并推送到数据包交换系统(即TCP)。如果是这种情况,您应该研究其中一个:

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

    • 如果没有任何代码来重现问题,则很难找出问题所在

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

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


      当然,您是否尝试禁用防病毒包检查?他们中的一些人在检查IP数据包(即使不是HTTP)时会大大降低IP流量,这会导致这样的随机IP流量阻塞。

      实际上,考虑到Indy可以通过TCP管理500Mbps的流量,很明显TCP不是问题所在。我想知道什么样的应用程序之间需要超过500Mbps的带宽!问题很可能是数据无法更快地处理,而不是通信通道是限制因素。@Misha,有人说
      “640kb对任何人都应该足够了。”
      。想象一个需要500Mbps的应用程序并不特别困难(特别是考虑到我的PC中有两个Gbps网卡,其中一个网卡与服务器之间有一条直连电缆,没有交换机,只有最高速度和低延迟,我可能可以使用更多)由于TCP窗口的大小,PS往返时间是大多数TCP通信的限制因素(请参阅)。获得更好性能的方法是使用多个TCP连接,因为每个连接的吞吐量都是有限的。@Misha“实际上,考虑到Indy可以通过TCP管理500Mbps”我阅读了Indy的文档,但没有找到任何相关信息,但这正是我要找的文档,如果你能指出这一点,那就太好了。@Stijn Sanders我在我的应用程序中使用TCP IP,因为现在它在同一台计算机上,但在不久的将来它可能在两台计算机上。顺便问一下,你是如何测量带宽的?您是在发送还是接收字节时计算字节数?谢谢,我将手动对其进行基准测试,并通过这种方式找到限制。