Delphi:为什么IdHTTP.ConnectTimeout使请求变慢?
发布时间:2020-12-15 04:18:28 所属栏目:大数据 来源:网络整理
导读:我发现在为TIdHTTP组件设置ConnectTimeoout属性时,它会使请求(GET和POST)变得慢约120ms? 为什么会这样,我可以以某种方式避免/绕过这个吗? 环境:D2010发布的Indy组件,为D2010安装了所有更新.操作系统是WinXP(32位)SP3,大多数补
我发现在为TIdHTTP组件设置ConnectTimeoout属性时,它会使请求(GET和POST)变得慢约120ms?
为什么会这样,我可以以某种方式避免/绕过这个吗? 环境:D2010发布的Indy组件,为D2010安装了所有更新.操作系统是WinXP(32位)SP3,大多数补丁…… 我的时间常规是: Procedure DoGet; Var Freq,T1,T2 : Int64; Cli : TIdHTTP; S : String; begin QueryPerformanceFrequency(Freq); Try QueryPerformanceCounter(T1); Cli := TIdHTTP.Create( NIL ); Cli.ConnectTimeout := 1000; // without this we get < 15ms!! S := Cli.Get('http://127.0.0.1/empty_page.php'); Finally FreeAndNil(Cli); QueryPerformanceCounter(T2); End; Memo1.Lines.Add('Time = '+FormatFloat('0.000',(T2-T1)/Freq) ); End; 使用代码中设置的ConnectTimeout,我得到了平均值. 130-140ms的时间,没有它约5-15ms …… 解决方法
当ConnectTimeout为零(且TIdAntifreeze未生效)时,Indy只是连接.否则,TIdIOHandlerStack.ConnectClient调用DoConnectTimeout,它创建一个新线程来进行连接,同时调用线程休眠并处理TIdAntifreeze操作,等待建立连接.如果在超时时间之前没有连接,则会抛出异常.
线程不是空闲的,并且在检查连接线程是否已完成其任务之前,调用线程将始终处于休眠状态.默认睡眠持续时间为125毫秒. (要使用其他内容,请激活TIdAntifreeze并将其IdleTimeout属性设置为低于125.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |