2013-06-19 2 views
0

고성능 C++ 응용 프로그램의 중간에있는 서버에서 URL을 핑 (ping)하려고합니다. 매 밀리 초가 중요합니다. 쿼리의 반환 데이터에 대해 신경 쓰지 않아요 ... 특정 URL에 HTTP 요청을 보내야합니다.로드가 발생하려면 가장 효과적인 비 차단 메서드를 찾으려고합니다. 이것을 달성하기 위해.C++ URL을 찾는 가장 빠른 방법

내 응용 프로그램은 Boost :: ASIO를 사용하지만,이 작업을 수행하는 대부분의 방법은 빌드 할 때마다 (불행하게도 필요할 수도있는) 소켓을 매번 뜯어내는 것과 관련이있는 것처럼 보입니다.하지만 기본 C/C++ 소켓이 필요합니다. 라이너는 오버 헤드, 메모리 누수, 블로킹 등을 일으키지 않습니다. 그냥 소켓을 열고 HTTP 요청을 끈 다음 함께 이동하십시오.

그리고 이것은 초당 수천 번 발생해야하므로 소켓과 오버 헤드가 중요합니다 (OS가 넘치지 않아야 함).

누구든지이 작업을 수행하는 가장 효율적인 방법에 대해 조언을 구하십니까?

감사합니다.

+0

나는 서버 측에서 제어 할 수 없다고 생각한다. 도스를 좀하고 싶니? ;) – Pragmateek

+0

"시기상조 최적화는 모든 악의 근원"[¹] (http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize). 먼저 작동시키고 * 측정 *하여 핫스팟이 어디에 있는지 확인하십시오. C++에서 HTTP가 TCP 연결을 필요로한다는 사실을 알기가 꽤 어렵습니다. – msw

+0

하나의 [지속적인 HTTP 연결] (http://en.wikipedia.org/wiki/HTTP_persistent_connection)을 사용하고 있습니까? – Casey

답변

1

초당 수천 통의 알림이 전송되면서 각각에 대해 소켓 연결을 여는 것을 상상할 수 없습니다. 아마 오버 헤드로 인해 너무 비효율적 일 것입니다. 따라서 Casey가 제안한 것처럼 전용 연결을 사용해보십시오.

메인 스레드에서 상당히 처리하는 것처럼 들리므로 소켓 작업을위한 작업자 스레드를 만드는 것이 좋습니다. 최소한 mutex 나 critical 섹션과 같은 스레드 동기화 객체를 사용하여 코드를 단일 스레드로 처리해야합니다. 적어도 주 스레드의 컨테이너 (아마도 대기열)를 업데이트하고 작업자 스레드에서이를 읽어야합니다.

+0

내 앱이 이미 멀티 스레드입니다. 나는 그런 특별한 연결에 대한 경험이 없다. 내가 볼 수있는 예제 코드가 있습니까? 감사! – Harry

+0

전에 http를 사용하지 않았습니다. SSL을 사용하여 여러 서버에 연결하는 Windows C++ 클라이언트에 ASIO를 사용했습니다. 그러나이 [link] (http://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio/examples.html)에서 HTTP를 사용하는 몇 가지 ASIO 예제가 있습니다. –

관련 문제