Prestazioni HTTP2 vs HTTP1

· Funzionalità

sgcWebSockets supporta un'ampia gamma di protocolli, HTTP/2 è il protocollo attualmente in sviluppo. 

HTTP 1.1 è stato il protocollo HTTP più utilizzato e ampiamente implementato in server e client durante gli ultimi 15 anni. Ma con la crescita di internet, le applicazioni e i siti web sono cresciuti e la quantità di dati caricati è aumentata, le carenze di HTTP 1.1 sono diventate più evidenti. Sostanzialmente una richiesta per connessione e la duplicazione delle richieste.

HTTP 2 ha alcuni vantaggi come: 


Test di HTTP 1.1 

Il test è molto semplice, basta chiamare il server per ottenere un'immagine 100 volte, una per una, quindi quando la prima termina, viene inviata la seconda richiesta e così via.

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;

Test di HTTP 2.0

Il test è ancora più semplice rispetto a HTTP 1.1, basta creare il componente http2 e chiamare 100 volte la richiesta GET, non c'è bisogno di attendere una risposta perché le risposte vengono inviate in modo asincrono quando vengono ricevute dal client. 

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;

E il vincitore è...

Molto probabilmente sai già quale protocollo è più veloce, puoi testarlo da te usando la seguente demo compilata per Windows. 

NOTA: nella demo, il test HTTP1.1 viene eseguito in un thread secondario e HTTP2.0 è asincrono quindi non ha bisogno di essere eseguito in un thread secondario.