[英]How to optimize parse data flow algorithm?
我需要使用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
函数传递给我的班级。 数据块的长度从一个调用到另一个调用而变化。 我知道协议的数据包格式,并且知道如何组织对话,因此我可以通过当前pos_
判断我是否有足够的数据来解析Nth
部分。 现在实现如下:
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
可能会被调用很多次,并且每次都要经过所有开关)。
您并不需要所有的bool
和pos_
,因为它们似乎仅保持对话已通过的状态,因此您可以继续进行下一部分。
怎么样:为对话的每个部分编写一个解析函数
bool parse_part_one(const char *data) {
... // parse the data
next_fun = parse_part_two;
return true;
}
bool parse_part_two(const char *data) {
... // parse the data
next_fun = parse_part_thee;
return true;
}
...
然后在您的类中添加一个指向当前解析函数的指针(从1开始)。 现在,在on_data
您要做的就是调用下一个解析函数
bool success = next_fun(data);
由于每个函数都将指针设置为下一个解析函数,因此on_data
的下一次调用将自动调用下一个解析函数。 无需测试您在会话中的位置。
如果len
的值很关键(我认为是关键值),则也将其传递给它,并返回false
表示无法解析该部分(在这种情况下也不要更新next_fun
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.