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 keep-alives,每次调用时都会强制关闭连接,除非启用了该标志。断开和重新连接的额外开销可能会导致额外的时间。

于 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 回答