Delphi-IOCP學習筆記<九>======性能測試和IOCP源碼下載<5000個連接數>


剛剛的測試,服務端上圖

image

開了5個客戶端<每個客戶端1000>進行測試。

內存視乎不是很多。客戶端的發過來的數據包大小在4096+88字節左右。

 

測試Echo測試線程

procedure TfrmMain.btnEchoTesterClick(Sender: TObject);
var
  lvEchoTester:TEchoTester;
  i:Integer;
begin
  for I := 1 to StrToInt(edtCount.Text) do
  begin
    lvEchoTester := TEchoTester.Create;
    lvEchoTester.TcpClient.Host := '127.0.0.1';
    lvEchoTester.TcpClient.Port := StrToInt(edtPort.Text);
    lvEchoTester.Resume;
    FTesterList.Add(lvEchoTester);
  end;
end;

 

EchoTester線程

unit uEchoTester;

interface

uses
  Classes, IdTCPClient, SysUtils,
  uJSonStreamObject, IdGlobal, superobject,
  Windows;

type
  TEchoTester = class(TThread)
  private
    FTcpClient: TIdTcpClient;
    function createObject: TJSonStreamObject;
    procedure echoWork(pvObject: TJSonStreamObject);
  public
    constructor Create;
    destructor Destroy; override;

    procedure Execute;override;

    property TcpClient: TIdTcpClient read FTcpClient;
  end;

implementation

uses
  ComObj, uJSonStreamCoder;

constructor TEchoTester.Create;
begin
  inherited Create(true);
  FTcpClient := TIdTcpClient.Create(nil);
end;

destructor TEchoTester.Destroy;
begin
  FTcpClient.Free;
  inherited Destroy;
end;

function TEchoTester.createObject: TJSonStreamObject;
var
  lvStream:TMemoryStream;
  lvData:String;
begin
  Result := TJSonStreamObject.Create;
  Result.JSon := SO();
  Result.JSon.I['cmdIndex'] := 1000;   //echo 數據測試
  Result.JSon.S['data'] := '測試發送打包數據';
  Result.JSon.S['key'] := CreateClassID;

  lvStream := TMemoryStream.Create;
  SetLength(lvData, 1024 * 4);
  FillChar(lvData[1], 1024 * 4, Ord('1'));
  lvStream.WriteBuffer(lvData[1], Length(lvData));
  Result.setStream(lvStream);
end;

procedure TEchoTester.echoWork(pvObject: TJSonStreamObject);
var
  lvStream, lvPackStream:TMemoryStream;
  lvData:String;
  lvBuffer:TIdBytes;
  l, j, x:Integer;
begin
  lvPackStream := TMemoryStream.Create;
  try
    TJSonStreamCoder.Encode(pvObject, lvPackStream);

    SetLength(lvBuffer, lvPackStream.Size);
    lvPackStream.Position := 0;
    lvPackStream.ReadBuffer(lvBuffer[0], lvPackStream.Size);
    FTcpClient.Socket.Write(lvBuffer);

    l := FTcpClient.Socket.ReadLongInt(False);
    j := FTcpClient.Socket.ReadLongInt(False);

    //json數據
    SetLength(lvBuffer, l);
    FTcpClient.Socket.ReadBytes(lvBuffer, l, False);
    SetLength(lvData, l);
    ZeroMemory(@lvData[1], l);
    CopyMemory(@lvData[1], @lvBuffer[0], l);
    pvObject.JSon := SO(lvData);
    
    SetLength(lvBuffer, j);
    FTcpClient.Socket.ReadBytes(lvBuffer, j, False);
    pvObject.Stream.Size := 0;
    pvObject.Stream.Write(lvBuffer[0], j);

    SetLength(lvBuffer, pvObject.Stream.Size);
    pvObject.Stream.Position := 0;
    pvObject.Stream.ReadBuffer(lvBuffer[0], pvObject.Stream.Size);

    SetLength(lvBuffer, 0);
  finally
    lvPackStream.Free;
  end;
end;

{ TEchoTester }

procedure TEchoTester.Execute;
var
  lvJSonObject:TJSonStreamObject;
begin
  FTcpClient.Connect;
  lvJSonObject := createObject;
  try
    while (not self.Terminated) do
    begin
      try
        echoWork(lvJSonObject);
      except

      end;
    end; 
    FTcpClient.Disconnect;
  finally
    lvJSonObject.Free;
  end;
end;

end.

 

 

本次優化了代碼,解決了內存泄漏的問題。使用了fastMM,如果沒有的話,可以注釋掉。

 

這一篇應該是學習筆記的最后一篇了。

 

最后還是上傳Demo

Delphi-IOCP 性能測試


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM