HTTP2 vs HTTP1 Performance

· Funktionen

sgcWebSockets unterstützt eine Vielzahl von Protokollen. HTTP/2 ist das Protokoll, das gerade in Entwicklung ist. 

HTTP 1.1 war in den letzten 15 Jahren das meistgenutzte HTTP-Protokoll und ist weit in Servern und Clients verbreitet. Mit dem Wachstum des Internets, dem Wachstum der Anwendungen und Webseiten und der zunehmenden Datenmenge wurden die Schwächen von HTTP 1.1 immer deutlicher: im Grunde eine Anfrage pro Verbindung und das Duplizieren von Anfragen.

HTTP 2 bringt einige Vorteile mit: 


HTTP 1.1 testen 

Der Test ist sehr einfach: Den Server 100-mal nach einem Bild fragen, eines nach dem anderen. Wenn das erste fertig ist, geht die zweite Anfrage raus und so weiter.

procedure TestHTTP1;
begin
  oHTTP := TIdHTTP.Create(nil);
  Try
    for i := 1 to 100 do
    begin
      oStream := TMemoryStream.Create;
      Try
        oHTTP.Get('https://ik.imagekit.io/demo/img/http_test/h_' + Format('%.2d', [i]) + '.jpg', oStream);
        oJPEG := TJPEGImage.Create;
        oJPEG.Scale := jsHalf;
        oStream.Position := 0;
        oJPEG.LoadFromStream(oStream);
        ...
        TThread.Queue(nil,
        procedure
        begin
          FRMHTTP2_Client.imgHTTP.Canvas.Draw(vCol * 50, vRow * 50, oJPEG);
        end);
      Finally
        oStream.Free;
      End;
    end;
  Finally
    oHTTP.Free;
    Terminate;
  end;      
end;   

HTTP 2.0 testen

Der Test ist noch einfacher als bei HTTP 1.1: Einfach die http2-Komponente anlegen und 100-mal eine GET-Anfrage absetzen. Es ist nicht nötig, auf eine Antwort zu warten, denn die Antworten werden asynchron ausgeliefert, sobald der Client sie empfängt. 

procedure TestHTTP2;
var
  oHTTP2: TsgcHTTP2Client;
begin
  oHTTP2 := TsgcHTTP2Client.Create;
  oHTTP2.OnHTTP2Response := OnHTTP2ResponseEvent;
  oHTTP2.Request.Accept := 'image/*,*/*;q=0.8';
  for i := 1 to 100 do
    oHTTP2.Get('https://ik.imagekit.io/demo/img/http_test/h_' + Format('%.2d', [i]) + '.jpg');
end;
procedure OnHTTP2ResponseEvent(const Connection: TsgcHTTP2ConnectionClient; const Request: TsgcHTTP2RequestProperty; const Response: TsgcHTTP2ResponseProperty);
var
  oJPEG: TJPEGImage;
  vCol, vRow: Integer;
begin
  oJPEG := TJPEGImage.Create;
  oJPEG.LoadFromStream(Response.Data);
  oJPEG.Scale := jsHalf;
  ...
  TThread.Queue(nil,
  procedure
  begin
    if Assigned(imgHTTP2) then
    begin
      imgHTTP2.Canvas.Draw(vCol * 50, vRow * 50, oJPEG);
    end;
  end);
end;   

Und der Gewinner ist...

Wahrscheinlich weißt du schon, welches Protokoll schneller ist. Du kannst es selbst mit folgender kompilierten Demo für Windows ausprobieren. 

HINWEIS: In der Demo läuft der HTTP1.1-Test in einem Sekundär-Thread, während HTTP2.0 asynchron ist und daher keinen Sekundär-Thread benötigt.