在mpeg系列(mpeg1,mpeg2,mpeg4)标准之中,系统层和视频层都有类似0x000001xx开头的起始码,解析协议或者解码过程中常常需要寻找类似的起始码。
最直观,最省力,不耗费心思优化的代码如下:
...
int Bfr = 0xCDCDCDCD;
while((Bfr &0xffffff00) != 0x100) {
Bfr = (Bfr << 8) | *p++;
}
...
每次循环p指正向后移动一个字节单位,复杂度为O(n), n为找到起始码所读取的字节数;
我们来看看快些的方法:
...
while(valid(p)){
if (p[-1] > 1) p += 3;
else if (p[-2] ) p += 2;
else if(p[-3]|(p[-1]-1)) p++;
else {
p++;
break;
}
}
...
显然,这一算法的复杂度在理想条件下,可以降到O(n/3)。
在平时的优化工作中,需着眼小处仔细思考,抓出像这种地方。
阅读(926) | 评论(0) | 转发(0) |