C++로 추상 프로토콜 클라이언트 - 서버 대화 파싱 라이브러리를 구현해야합니다. 나는 전체 클라이언트 - 서버 대화를 담고있는 파일을 가지고 있지는 않지만 그것을 즉시 파싱해야한다. 나는 인터페이스 다음 구현해야한다 :구문 분석 데이터 흐름 알고리즘을 최적화하는 방법?
class parsing_class
{
public:
void on_data(const char* data, size_t len);
//other functions
private:
size_t pos_;// current position in the data flow
bool first_part_parsed_;
bool second_part_parsed_;
//... some more bool markers or something like vector<bool>
};
데이터는 on_data
기능을 통해 내 클래스에 전달됩니다. 데이터 청크 길이는 호출마다 다릅니다. 프로토콜의 패킷 형식을 알고 대화를 구성하는 방법을 알고 있으므로 Nth
부분을 구문 분석 할 충분한 데이터가 있는지 여부를 현재 pos_
으로 판단 할 수 있습니다. 이제 구현은 다음과 같다 :
void parsing_class::on_data(const char* data, size_t len)
{
pos_ += len;
if(pos > FIRST_PART_SIZE and !first_part_parsed_)
parse_first_part(data, len);
if(pos > SECOND_PART_SIZE and !second_part_parsed_)
parse_second_part(data, len);
//and so on..
}
내가 원하는 것은이 알고리즘을 최적화하는 방법을 몇 가지 팁입니다. 어쩌면이 수많은 것을 피하기 위해 if
(on_data
은 여러 번 호출 될 수 있으며 모든 스위치를 거쳐야합니다.)
on_data가 동일한 데이터로 두 번 호출되는 것처럼 보입니까? 그렇지 않으면이 논리가 필요하지 않습니까? – billz
이것은 클라이언트가 여러 번 호출 할 때마다 새로운 데이터 덩어리로 호출되며 내부 저장소에 추가하고 구문 분석합니다. 내가 enogh 정보를 가지고 있다고 결정할 때, 나는 infrom 사용자에게 작업이 완료되었음을 사용자가 제공 한 callback이라고 부른다. – Alexander
first_part_parsed_/second_part_parsed_는 중복 되었습니까? pos와 단계를 구분할 수 있습니까? – billz