2010-05-05 25 views
7

मुझे पता चला कि TIdHTTP घटक के लिए कनेक्टटाइमआउट प्रॉपर्टी सेट करते समय, यह अनुरोध करता है (GET और POST) लगभग 120 मिमी धीमा हो जाता है?डेल्फी: IdHTTP.ConnectTimeout अनुरोध धीमा क्यों करता है?

यह क्यों है, और क्या मैं इसे किसी भी तरह से टालना/बाईपास कर सकता हूं?

एनवी: डी 2010 भेजे गए इंडी घटकों के साथ, डी 2010 के लिए सभी अद्यतन स्थापित किए गए। ओएस सबसे पैच के साथ 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 ...

उत्तर

14

जब ConnectTimeout शून्य है (और TIdAntifreeze प्रभाव में नहीं है), इंडी बस कनेक्ट हो जाती है। अन्यथा, TIdIOHandlerStack.ConnectClientDoConnectTimeout, जो कनेक्ट करते हुए बुला धागा सोता है और प्रक्रियाओं TIdAntifreeze संचालन, के लिए कनेक्शन स्थापित होने की प्रतीक्षा कर ऐसा करने के लिए एक नया धागा बनाता है कहते हैं। यदि समय समाप्ति के समय कनेक्शन नहीं है, तो यह अपवाद फेंकता है।

थ्रेड मुक्त नहीं हैं, और कॉलिंग थ्रेड हमेशा यह जांचने से पहले सो जाएगा कि कनेक्शन थ्रेड ने अपना कार्य पूरा कर लिया है या नहीं। डिफ़ॉल्ट नींद की अवधि 125 एमएस है। (कुछ और उपयोग करने के लिए, TIdAntifreeze सक्रिय करें और 125 से कम IdleTimeout संपत्ति सेट करें।)

+2

"कॉलिंग थ्रेड हमेशा यह जांचने से पहले सो जाएगा कि कनेक्शन थ्रेड ने अपना कार्य पूरा कर लिया है या नहीं।" यह पुराने संस्करणों में सच था, लेकिन यह मार्च 2008 से सच नहीं रहा है। –

+0

"यह पुराने संस्करणों में सच था, लेकिन मार्च 2008 से यह सच नहीं हुआ है।" - और यह एक अच्छी बात है क्योंकि पुराने व्यवहार (और शायद किया गया है) एक बग माना जाना चाहिए। – TheBlastOne

+0

इस सवाल को टक्कर देने के लिए खेद है, लेकिन मैं 10.2 टोक्यो का उपयोग कर रहा हूं और मुझे ओपी के रूप में एक ही व्यवहार का अनुभव हो रहा है, टाइमआउट के बिना 10-15ms कनेक्शन समय, 130-140ms के साथ। तो ऐसा लगता है कि "कनेक्शन थ्रेड ने अपना काम पूरा कर लिया है या नहीं, यह जांचने से पहले कॉलिंग थ्रेड हमेशा सो जाएगा" अभी भी चालू है। – Bozzy

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^