1

デルファイ 2009

私は最近、複数の GET リクエストから単一の POST に切り替えました。これはより効率的であると考えていましたが、はるかに遅いことが判明しました。1 ~ 2 秒から 8 ~ 10 秒になりましたが、その理由がわかりません。

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP;

type
  TForm4 = class(TForm)
    d: TIdHTTP;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var m: tmemorystream;
    data: tstringlist;
    i: integer;
begin
  memo1.Clear;

  m:=tmemorystream.Create;
  data:=tstringlist.Create;
  data.Add(format('test1');
  data.Add(format('test2');

  d.Post('http://www.someurl.com/test.php', data, m);
  m.Position:=0;
  data.LoadFromStream(m);
  memo1.Lines.Add('Received:');

  for i := 0 to data.count - 1 do
    memo1.Lines.Add(data[i]);

  m.Free;
  data.Free;
end;

end.

そしてサーバー上で

<?php
echo "1\n";
?>
4

2 に答える 2

7

プロパティhoKeepOriginalProtocolでフラグが有効になっていることを確認してください。TIdHTTP.HTTPOptionsデフォルトでTIdHTTP.Post()は、フラグが有効になっていない限り、HTTP キープアライブの使用に関係なく、呼び出されるたびに接続が強制的に閉じられます。切断と再接続の追加のオーバーヘッドが、余分な時間の原因になる場合があります。

于 2012-11-10T02:53:44.210 に答える
6

さまざまな URL を使用して簡単なテストを行いました。

d.Post('http://whatismyip.org', data, m); // Using DNS name

また

d.Post('http://54.242.203.46', data, m); // Using IP

投稿に約 1 秒かかったので、問題は Indy に関係していない可能性があります。私の提案:

  • PC の DNS 解決を確認します。違いがあるかどうかを確認するために IP アドレスを使用してみてください。
  • 外部ツール (curl、vbscript など) を使用して同じサイトに POST リクエストを発行し、時間を測定してみてください。
  • ネットワーク監視ツール (Wireshark、MS Network Monitor など) を使用して、サーバーが POST 要求に応答するのにかかる時間、またはクライアントがアドレスの解決と実際の Post 要求の間に費やす時間を確認します。

これらの手順により、問題の場所を絞り込むことができます。

これらのいずれでも解決しない場合は、Indy を最新バージョンにアップグレードしてみてください。

于 2012-11-10T00:53:53.290 に答える