2010-05-05 36 views
7

Tôi phát hiện ra rằng khi thiết lập thuộc tính ConnectTimeoout cho một thành phần TIdHTTP, nó làm cho các yêu cầu (GET và POST) trở nên chậm hơn khoảng 120ms?Delphi: Tại sao IdHTTP.ConnectTimeout thực hiện yêu cầu chậm hơn?

Tại sao điều này và tôi có thể tránh/bỏ qua điều này bằng cách nào đó?

Env: D2010 được vận chuyển thành phần Indy, tất cả các bản cập nhật được cài đặt cho D2010. OS là WinXP (32bit) SP3 với hầu hết các bản vá lỗi ...

thường xuyên thời gian của tôi là:

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; 

Với bộ ConnectTimeout trong mã tôi nhận được trung bình. thời gian 130-140ms, không có khoảng 5-15ms ...

Trả lời

14

Khi ConnectTimeout là 0 (và TIdAntifreeze không có hiệu lực), Indy chỉ cần kết nối. Nếu không, TIdIOHandlerStack.ConnectClient gọi DoConnectTimeout, trong đó tạo chủ đề mới để thực hiện kết nối trong khi chuỗi gọi và quy trình TIdAntifreeze hoạt động, đang chờ kết nối được thiết lập. Nếu không có kết nối vào thời gian hết thời gian chờ, nó sẽ ném một ngoại lệ.

Chủ đề không miễn phí và chuỗi cuộc gọi sẽ luôn luôn ngủ trước khi kiểm tra xem chuỗi kết nối có hoàn thành nhiệm vụ của mình hay không. Thời lượng ngủ mặc định là 125 ms. (Để sử dụng một cái gì đó khác, hãy kích hoạt TIdAntifreeze và đặt thuộc tính IdleTimeout thấp hơn 125.)

+2

"chuỗi cuộc gọi sẽ luôn ngủ trước khi kiểm tra xem chuỗi kết nối đã hoàn thành nhiệm vụ hay chưa". Điều đó đúng trong các phiên bản cũ, nhưng điều đó không đúng kể từ tháng 3 năm 2008. –

+0

"Điều đó đúng trong các phiên bản cũ, nhưng điều đó không đúng kể từ tháng 3 năm 2008." - và đó là một điều tốt vì hành vi cũ hơn nên được (và có thể đã được) coi là một lỗi. – TheBlastOne

+0

Xin lỗi vì đã làm phiền câu hỏi này, nhưng tôi đang sử dụng 10.2 Tokyo và tôi đang trải qua hành vi giống như OP, thời gian kết nối 10-15ms mà không hết thời gian chờ, 130-140ms với. Vì vậy, có vẻ như "các thread gọi sẽ luôn luôn ngủ trước khi kiểm tra xem các chủ đề kết nối đã hoàn thành nhiệm vụ của mình" vẫn còn hiện hành. – Bozzy

Các vấn đề liên quan