문제

성능 측면에서 한 번에 1바이트씩 소켓에서 읽는 것과 큰 덩어리로 읽는 것의 차이점은 무엇입니까?

웹 서버에서 페이지를 가져와 수신된 페이지를 한 줄씩 구문 분석해야 하는 C++ 응용 프로그램이 있습니다.현재 CRLF가 발생하거나 최대 1024바이트에 도달할 때까지 한 번에 1바이트씩 읽고 있습니다.

큰 덩어리로 읽는 경우(예:한 번에 1024바이트)는 성능 측면에서 훨씬 더 좋습니다. 현재와 동일한 동작을 달성하는 방법에 대한 아이디어(예:한 번에 1개의 HTML 라인을 저장하고 처리할 수 있습니까? 아직 후속 바이트를 소비하지 않고 CRLF까지)?

편집하다:

너무 큰 버퍼를 감당할 수 없습니다.애플리케이션이 임베디드 장치에 사용되기 때문에 코드 예산이 매우 부족합니다.나는 고정 크기 버퍼를 하나만 유지하는 것을 선호하며, 한 번에 하나의 HTML 라인을 유지하는 것이 바람직합니다.이렇게 하면 구문 분석을 위해 버퍼에 액세스하려고 할 때마다 구문 분석 및 기타 처리가 쉬워지며 하나의 완전한 HTML 라인을 처리하고 있다고 가정할 수 있습니다.

감사해요.

도움이 되었습니까?

해결책

소켓에서 직접 읽고 버퍼링 할 수있는 중간 상위 레벨 표현이 아닌 의심의 여지없이 1024 바이트를 완전히 읽고 버퍼에 RAM에 넣는 것이 좋습니다. RAM에서 데이터를 구문 분석하십시오.

왜요? 소켓에서 읽는 것은 시스템 호출이며 각 읽기의 컨텍스트 스위치가 발생합니다. 그것에 대해 자세히 알아보십시오 : IBM Tech Lib : 소켓 성능 부스트

다른 팁

C ++에 대해서는 언급 할 수 없지만 다른 플랫폼에서 - 예, 이것은 차이점; 특히 코드가해야 할 스위치의 양과 스트림의 비동기 특성에 대해 걱정 해야하는 횟수 등.

그러나 실제 테스트는 물론 프로필입니다. 두 가지 접근 방식을 사용하여 임의의 파일을 통해 휘젓는 기본 앱을 작성하고 일부 일반적인 파일을 테스트하지 않겠습니까 ... 효과는 일반적으로 놀랍습니다. 만약에 코드는 IO 바운드입니다. 파일이 작고 대부분의 앱 런타임이 사용되는 경우 처리 데이터가 메모리에 있으면 차이를 발견하지 못할 것입니다.

가장 먼저 :

cin.getline(buffer,1024);

둘째, 일반적으로 모든 IO가 버퍼링되어 너무 걱정할 필요가 없습니다.

셋째, CGI 프로세스 시작은 일반적으로 입력 처리보다 훨씬 더 많은 비용이 듭니다 (큰 파일이 아닌 한). 따라서 생각하지 않을 수도 있습니다.

안녕하세요,

한 번에 한 바이트씩 수행함으로써 성능에 큰 영향을 미치는 것 중 하나는 컨텍스트가 사용자 시간에서 시스템 시간으로 계속해서 이동한다는 것입니다.그리고 끝났다.전혀 효율적이지 않습니다.

일반적으로 MTU 크기까지 하나의 큰 청크를 잡는 것이 훨씬 더 효율적입니다.

콘텐츠를 벡터로 스캔하고 이를 반복하여 을 찾아 입력을 웹 입력 라인으로 분리하는 것은 어떨까요?

HTH

건배,

소켓에서 한 번에 하나의 바이트를 읽지 않고 C/C ++ I/O 시스템에서 Atime에서 하나의 바이트를 읽는 것입니다. CGI를 사용하는 경우 소켓에서 모든 입력을 버퍼링 할 수 있습니다. 버퍼링 된 I/O의 요점은 프로그래머가 처리하기에 편리한 방식으로 프로그래머가 이용할 수 있도록하는 것입니다. 따라서 한 번에 하나의 바이트를 처리하려면 계속 진행하십시오.

편집하다: 반성하면 CGI를 구현하거나 사용하는 경우 질문에서 명확하지 않습니다. 코드 스 니펫을 게시하여 현재 읽은 방법을 나타내는 코드 스 니펫을 게시하여이를 명확히 할 수 있습니다.

소켓을 직접 읽는 경우 버퍼에 대한 Get에 대한 전체 응답을 읽은 다음 처리해야합니다. 여기에는 성능과 코딩 용이성을 포함하여 수많은 장점이 있습니다.

작은 버퍼에 라이닝 된 경우 다음과 같은 클래식 버퍼링 알고리즘을 사용하십시오.

getbyte:
   if buffer is empty
      fill buffer
      set buffer pointer to start of buffer
   end
   get byte at buffer pointer
   increment pointer

fdopen () 함수로 소켓 파일 Descritpor를 열 수 있습니다. 그런 다음 IO를 버퍼링하여 해당 디스크립터에서 fgets () 또는 이와 유사하게 호출 할 수 있습니다.

운영 체제 수준에는 차이가 없으며 데이터는 어쨌든 버퍼링됩니다. 그러나 응용 프로그램은 한 번에 하나씩 "읽기"바이트를 위해 더 많은 코드를 실행해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top