2011-01-31 5 views
3

C++ 프로그램에서 특정 라이브러리를 사용하여 다른 웹 사이트를 연결하고 가져 왔습니다. 주로 Chillkat과 Curl을 사용했습니다. 그러나 최근에는 MSDN 및 Winsocket2 라이브러리를 사용하여 내 자신의 HTTP 가져 오기 프로그램을 프로그래밍하기 시작했습니다.C++에서 HTTP GET 메서드의 속도

SOCKET_STREAM 유형의 소켓을 열고 Ipv4의 경우 으로 소프트웨어를 프로그래밍 한 다음 필요한 웹 사이트와 연결을 설정하고 "호스트 :"및 "연결 : 닫기"헤더가 포함 된 GET 요청을 섬기는 사람. 모든 것이 잘 작동하는 것처럼 보입니다. 그러나 예상대로 성능이 떨어집니다. 번들로 묶인 Chillkat 라이브러리는 여전히 내 것이 더 좋습니다. 비록 내가 할 수있는만큼 내 것을 최적화했다.

요청을 보내면 일부 서버가 응답하는 데 시간이 오래 걸립니다. 그리고 일단 그들은 그들이 한꺼번에 모든 것을 보냅니다. 그렇다면 어떻게하면 빠른 응답을 시작하는 헤더 요청을 할 수 있습니까? 내 프로그램에 속도가 중요합니다.

+0

필자는 Chillkat이 보내는 헤더를 검사하여 아무 것도 놓치지 않았 음을 확인했지만 속도 위반을 요청하는 헤더가 있는지 의심 스럽다. 덩어리는 정상입니다. 많은 사이트가이를 수행하므로 자신의 라이브러리에서이를 처리해야합니다. – chrisaycock

+0

소켓 버퍼를 변경하면 성능이 향상되는지 확인하십시오. 데이터를 자주 읽지 않아도됩니다. 가끔 큰 덩어리를 기다리고 작은 덩어리를 여러 번 읽는 대신 한 번에 전달하는 것이 더 낫다 –

+1

수천 명의 결합 된 개발자 그룹에 의해 수행 된 최적화를 능가하는 최적화 된 기능을 작성하는 단일 사용자의 기회 모든 코드 검토 및 평가 각 다른 최적화는 사실상 0으로 작습니다. 속도 문제가 자주 사용되는 라이브러리를 사용하면 속도가 빨라집니다. –

답변

1

볼륨이 낮은 최신 컴퓨터에서 성능 차이가 발생하는 경우 Nagle 알고리즘을 끄는 것을 잊었을 가능성이 가장 높습니다. setsockopt()를 사용하여 TCP_NODELAY를 1로 설정하십시오. HTTP는 Telnet이 아닙니다.

성능 문제가 발생하고주의해야 할 볼륨이 충분할 때까지 플러시 또는 버퍼 관리 또는 이와 유사한 사항에 대해 걱정할 필요가 없습니다. 단일 쓰기 호출로 요청을 작성하는 것 이외.

다운로드 속도에있어 창 크기가 달라집니다. SO_SNDBUF 및 SO_RCVBUF를 조정할 수 있습니다. 벤치 마크를 빠르게하는 값은 실제 성능을 저하시킬 수 있음을 명심하십시오.

+0

감사합니다 janm, 나는 Nagle algo를 끄고 속도가 두 배로 증가했습니다. 정말 도움이되었습니다 .Chillkat 라이브러리보다 빠르지 만 속도는 같습니다. –

0

솔직히 HTTP는 복잡한 표준이며 구현을 최적화하는 여러 가지 방법이 있습니다. 그러나 Chillkat 또는 Curl과 같이 이미 패키지화 된 라이브러리보다 더 효과적으로 최적화 할 수있는 기회는 거의 없습니다. 만약 당신이 그것에 대해 가고 싶지, 내가 보내는 헤더의 수를 줄이고 소켓 버퍼를 플러시 (Nagle의 알고리즘을 우회) 소켓에 상태 줄을 작성 후 제안했다. 이렇게하면 적절하게 코드화 된 서버가 요청에 응답하기 위해 약간 더 길게 (몇 ms의 상단) 제공됩니다. 그러나 네트워크 구성이 "이상적"이 아닌 경우에도 문제가 발생할 수 있습니다.

마지막으로 네트워크와 관련하여 매우 큰 오차가 있으며 서버, 네트워크 및 OS에 따라 다른 전략을 사용하면 결과가 달라질 수 있습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 저는 cURL을 사용하고 싶지만 C++, MVC++ 2010 용으로 컴파일하는 방법을 모릅니다. –

+0

cURL은 M $ 개발을위한 패키지를 가질 수 없습니다. 다운로드 페이지 (http://curl.haxx.se/download.html)를 확인하십시오. –

관련 문제