HTTP2 と HTTP1 のパフォーマンス比較

· 機能

sgcWebSockets は幅広いプロトコルをサポートしており、HTTP/2 は現在開発中のプロトコルです。 

HTTP 1.1 は過去 15 年間で最も使用されてきた HTTP プロトコルであり、サーバーやクライアントに広く実装されています。しかしインターネットが成長し、アプリケーションや Web サイトが大きくなり、読み込まれるデータ量が増加するにつれて、HTTP 1.1 の欠点がより顕著になりました。基本的に接続ごとに 1 リクエストという制約と、リクエストの重複です。

HTTP 2 には以下のような利点があります。 


HTTP 1.1 のテスト 

テストは非常にシンプルで、サーバーから画像を 100 回、1 件ずつ取得するだけです。最初のリクエストが終わると 2 番目のリクエストを送信する、という流れを繰り返します。

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 よりさらにシンプルです。http2 コンポーネントを作成し、GET リクエストを 100 回呼び出すだけです。レスポンスはクライアントが受信した時点で非同期にディスパッチされるため、応答を待つ必要はありません。 

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 向けコンパイル済みデモを使用してご自身でテストできます。 

注: デモでは、HTTP1.1 のテストはセカンダリスレッドで実行されますが、HTTP2.0 は非同期のためセカンダリスレッドで実行する必要はありません。