2012-12-10 3 views
4

저는 HTTP 게시물을 통해 텍스트 메시지를 Slooce Tech API에 보내도록 응용 프로그램을 작성 중입니다. 응용 프로그램은 많은 양의 텍스트 메시지를 보내야하므로 속도를 최적화하려고합니다.HTTP Post Speed를 가속화하십시오.

아래 코드의 두 번째 조각 나는 현재 게시물을 전송하기 위해 사용하고있는 방법이다. 첫 번째 코드를 작성하여 HTTPWebResponse을 빠뜨리려고합니다.

문제는 새로운 방법이 실제로 느린 오히려 실행 0.25 초를 복용보다, 그것은 문제가 발생할 것입니다 때로는 초 이상 걸리는 것입니다. 그것은 그 또는이 응용 프로그램의 속도를 개선하기위한 다른 팁을 왜

는 아는 사람 있나요? 나는 Request.Proxy=null를 추가했으며, 조금 더 빨라졌습니다.

감사합니다.

public void QuickSend() 
    { 
     XML = "<message id=\"" + lMessageID + "\"><partnerpassword>" + PartnerPassword + "</partnerpassword><content>" + sMessage + "</content></message>"; 
     URL = "http://sloocetech.net:****/spi-war/spi/" + PartnerID + "/" + sRecipient + "/" + Keyword + "/messages/mt"; 
     HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL); 

     RequestBytes = System.Text.Encoding.ASCII.GetBytes(XML); 
     Request.Method = "POST"; 
     Request.ContentType = "text/xml;charset=utf-8"; 
     Request.ContentLength = RequestBytes.Length; 
     RequestStream = Request.GetRequestStream(); 
     RequestStream.Write(RequestBytes, 0, RequestBytes.Length); 
     RequestStream.Close(); 
    } 

그리고 여기에 원래 코드 :

수정 된 코드는 모든

public XDocument SendSMS() 
    { 
     XML = "<message id=\""+ lMessageID +"\"><partnerpassword>" + PartnerPassword + "</partnerpassword><content>" + sMessage + "</content></message>"; 
     URL = "http://sloocetech.net:****/spi-war/spi/" + PartnerID + "/" + sRecipient + "/" + Keyword + "/messages/mt"; 
     HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL); 

     RequestBytes = System.Text.Encoding.ASCII.GetBytes(XML); 
     Request.Method = "POST"; 
     Request.ContentType = "text/xml;charset=utf-8"; 
     Request.ContentLength = RequestBytes.Length; 
     RequestStream = Request.GetRequestStream(); 
     RequestStream.Write(RequestBytes, 0, RequestBytes.Length); 
     RequestStream.Close(); 

     HttpWebResponse Resp = (HttpWebResponse)Request.GetResponse(); 
     oReader = new StreamReader(Resp.GetResponseStream(), System.Text.Encoding.Default); 
     string backstr = oReader.ReadToEnd(); 

     oReader.Close(); 
     Resp.Close(); 

     Doc = XDocument.Parse(backstr); 
     return Doc; 
    } 
+4

'Request.GetResponse()'는 웹 요청에서 작성한 데이터를 실제로 전송하기 때문에 제외 할 수 없습니다. –

+0

'GetResponse' 코드 주위에'using' 문을 써야합니다. 이렇게하면'Close' 문을 생략 할 수도 있습니다. – Matthew

+3

당신은 높은 처리량을 달성하기 위해 병렬로 여러 개의 POST (즉, async/TPL/ThreadPool/...)를 보내야합니다 ... – Yahia

답변

2

첫째, 난 당신이 보게 될 모든 청구 매우 회의적인 것 특별한 개선을 위해 HttpWebRequest을 제작하고 있기 때문에 엄청난 개선이있었습니다. 너 같은 단일 스레드 요청의 병목 현상은 서버의 응답 시간뿐 아니라 네트워크 대기 시간이 될 것입니다. (아마도 그들은 당신의 요청에 응답하기 전에 많은 서버 측 처리를하고있을 것입니다).

당신은 응답을 기다리는 동안 CPU가 아무것도하지 않고 의미 차단 요청을 만들고있어. 응용 프로그램을 멀티 쓰레드하려면

, 당신은 다음과 같이 뭔가를 할 수 : 이것은 각각 10 개의 메시지를 보내드립니다 (10 개) 작업을 산란한다

var tasks = new Task[10]; 
for (int i = 0; i < 10; i++) 
{ 
    tasks[i] = Task.Factory.StartNew(() => 
    {  
     int messages_sent_by_one_task = 0;   
     while(messages_sent_by_one_task < 10) 
     { 
      QuickSend(); 
      messages_sent_by_one_task++; 
     } 
    }); 
} 
while (tasks.Any(t => !t.IsCompleted)) { } //wait for tasks to complete 

. 하나의 응답이 오랜 시간이 걸리면, 다른 9 개의 쓰레드가 계속 행복하게 계속 진행할 것입니다.

나는 이것이 당신이 incorporate asynchronous requests and HTTPClient에 있었다이다에 당신은 아마 향상시킬 수 있으리라 생각합니다, 그래서 당신의 10 개 스레드의 각은 결코 차단하지 않습니다. 그러나 나는 결코 이것을 시도하지 않았기 때문에 모범을 보일 자격이 없다고 느낍니다.

당신은 어떤 불경건 한 수까지 스레드의 수를 크랭크하지만 유혹을 피하기 위해 유혹 될 수

. 스레드를 만들고 관리하는 오버 헤드가 곧 따라 잡을 것입니다. 이상적인 숫자는 무엇인지 모르겠지만 실험 해보십시오.

+0

쿨, 고마워.이론적으로는 초당 80 개의 HTTP 요청을 처리 할 수있는 서비스 제공 업체가 있습니다. 비동기 요청과 멀티 스레딩을 살펴볼 것입니다. 왜냐하면 그것은 내가 찾고있는 것으로 보이기 때문입니다. 제안 해 주셔서 감사합니다! – ijb109

+0

지금 추가 중이므로 작동하는지 알려 드리겠습니다. – ijb109