문제

저는 애플리케이션 프로토콜의 여러 계층을 처리하기 위해 작성한 일부 코드를 최적화하려고 합니다.마음껏 활용했어요 std::string 성급한 최적화보다는 단순성을 위해 노력했습니다.응용프로그램이 너무 느리고 발그린드 & gprof 버퍼가 내 스택을 통해 위쪽으로 이동함에 따라 문자열을 복사하는 데 상당한 시간을 소비하고 있음을 보여줍니다.

시스템 버퍼에서 가장 낮은 애플리케이션 버퍼로 문자를 복사한 후에는 더 이상 데이터 복사를 피할 수 있을 것 같습니다.결국 스택 위로 올라갈 때 돌연변이가 발생하지 않습니다.

내 프로토콜 형식은 하나 이상의 개행 문자로 끝나는 "전송"입니다. 기록, 각각은 탭으로 구분된 여러 개의 항목으로 구성됩니다. 필드, 특수 토큰으로 종료됩니다.예:

RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n

이거 하나로 조립될텐데 std::string input_buffer라고 합니다.

전송 처리에는 다음을 추출하는 작업이 포함됩니다. 기록 버퍼에서 다음 레이어로 전달합니다.벡터 추출 필드 레코드에서 다음 레이어로 전달합니다.필드를 맵에 저장합니다.각 단계에서 새로운 std::strings가 할당되면서 데이터가 복사됩니다.

인덱스의 const 문자열을 input_buffer에 할당하고 길이는 ...복사도 하지 않고?예를 들어 RECORD 2는 오프셋 26에서 시작하고 길이는 24자입니다.

const std:string record (substr(input_buffer, 26), 24 );

나는 문자열 개체의 내부에 대해 잘 알지 못하지만 성능 보장은 어딘가에 간단한 문자 시퀀스가 ​​있고 거의 의심할 여지 없이 해당 문자의 메모리에 대한 포인터가 있음을 암시하는 것 같습니다.해당 포인터를 다른 문자열에 속한 메모리로 초기화할 수 있나요?

(내 컴파일러는 g++ 4.7이지만 이것이 4.8이 필요한 것이라면 그 점도 알아 주시면 감사하겠습니다.)

도움이 되었습니까?

해결책

내가 이해한 바로는 이 사람이 다음 후보로 적합한 것 같습니다. 부스트::string_ref.당신은 단순히 할 것입니다 boost::string_ref input(input_buffer); 그런 다음 통과 string_ref대신 스택을 쌓으세요.걱정해야 할 유일한 것은 원본 버퍼를 항상 활성 상태로 유지하는 것입니다.

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