HTTP/2 与 HTTP/1 性能对比

· 功能

sgcWebSockets 支持多种协议,HTTP/2 是目前正在开发中的协议。

HTTP 1.1 在过去 15 年中一直是最广泛使用的 HTTP 协议,在服务器和客户端中被大量实现。但随着互联网的发展,应用程序和网站规模不断增大,加载数据量持续增加,HTTP 1.1 的局限性日益突出,主要表现为每个连接只能处理一个请求以及请求重复问题。

HTTP/2 具有以下优势:


测试 HTTP 1.1

测试非常简单,依次向服务器请求同一张图片 100 次,第一次完成后再发送第二次请求,以此类推。

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

测试比 HTTP 1.1 更为简单:只需创建 HTTP/2 组件,调用 100 次 GET 请求,无需等待响应,因为响应在客户端收到时会异步分发。

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;   

胜者是……

您可能已经知道哪种协议更快,您可以使用以下已编译的 Windows 演示程序自行测试。

注意:在演示程序中,HTTP 1.1 测试运行在辅助线程中,而 HTTP/2 是异步的,无需在辅助线程中运行。