Rendimiento HTTP2 vs HTTP1

· Características

sgcWebSockets admite una amplia gama de protocolos; HTTP/2 es el protocolo que está en desarrollo ahora mismo. 

HTTP 1.1 ha sido el protocolo HTTP más usado y ampliamente implementado en servidores y clientes durante los últimos 15 años. Pero a medida que internet crecía, las aplicaciones y webs crecían y la cantidad de datos cargados aumentaba, las deficiencias de HTTP 1.1 se hicieron más evidentes. Básicamente una petición por conexión y duplicación de peticiones.

HTTP 2 tiene algunas ventajas como: 


Probando HTTP 1.1 

La prueba es muy simple: llama al servidor para obtener una imagen 100 veces, una por una, de modo que cuando termina la primera, se envía la segunda petición y así sucesivamente

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;   

Probando HTTP 2.0

La prueba es aún más simple que con HTTP 1.1: solo tienes que crear el componente http2 y llamar 100 veces a get request; no hay necesidad de esperar a obtener una respuesta porque las respuestas se despachan de forma asíncrona cuando son recibidas por el cliente. 

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;   

Y el ganador es...

Lo más probable es que ya sepas qué protocolo es más rápido; puedes probarlo tú mismo usando la siguiente demo compilada para windows. 

NOTA: en la demo, la prueba HTTP1.1 se ejecuta en un hilo secundario y HTTP2.0 es asíncrona, por lo que no necesita ejecutarse en un hilo secundario.