我有一个用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流量堵塞。