2010-05-05 4 views
7

TIdHTTP 구성 요소의 ConnectTimeoout 속성을 설정할 때 요청 (GET 및 POST)이 약 120ms 느려지는 것을 발견했습니다.Delphi : IdHTTP.ConnectTimeout이 요청을 느리게하는 이유는 무엇입니까?

왜 그런가요? 어떻게 든 피하거나 건너 뛸 수 있습니까?

인디 구성 요소가 포함 된 D2010 : D2010에 설치된 모든 업데이트. 나는 평균 얻을 코드에서 ConnectTimeout이 세트로

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; 

: OS는

내 타이밍 루틴은 대부분의 패치 WINXP (32 비트) SP3입니다. 시간이 130-140ms인데 약 5-15ms가 필요하지 않습니다 ...

답변

14

ConnectTimeout이 0 일 때 (그리고 TIdAntifreeze이 적용되지 않음) Indy가 연결됩니다. 그렇지 않은 경우 TIdIOHandlerStack.ConnectClientDoConnectTimeout을 호출합니다. 은 연결을 수행하기 위해 새 스레드을 생성하고 호출 스레드는을 잠자기하고 연결이 설정 될 때까지 대기하는 작업을 처리합니다. 타임 아웃이 경과 할 때까지 연결이 없으면 예외가 발생합니다.

스레드는 무료가 아니며 호출 스레드는 연결 스레드가 해당 작업을 완료했는지 여부를 확인하기 전에 항상 잠자기 상태가됩니다. 기본 절전 시간은 125ms입니다. (다른 것을 사용하려면 TIdAntifreeze을 활성화하고 IdleTimeout 속성을 125보다 낮게 설정하십시오.)

+2

"연결 스레드가 작업을 완료했는지 확인하기 전에 호출 스레드가 항상 잠자기 상태가됩니다." 이전 버전에서도 마찬가지 였지만 2008 년 3 월 이후로는 사실이 아닙니다. –

+0

"이전 버전에서는 사실 이었지만 2008 년 3 월 이후로는 사실이 아닙니다." 오래된 행동이 버그로 간주되어야하기 때문에 좋은 일입니다. – TheBlastOne

+0

이 질문에 불편을 끼쳐 드려 죄송합니다. 10.2 도쿄를 사용하고 있으며 OP와 동일한 동작, 시간 초과없이 10-15ms 연결 시간, 130-140ms를 경험하고 있습니다. 따라서 "연결 스레드가 해당 작업을 완료했는지 여부를 확인하기 전에 호출 스레드는 항상 잠자기 상태입니다"라는 메시지가 계속 표시됩니다. – Bozzy

관련 문제