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 は非同期のためセカンダリスレッドで実行する必要はありません。
