测试环境介绍
CPU型号:MPC8548MGHATGB,工作频率为1GHz
相机数据:280Mbps
以10W次CRC计算为例
#define COUNT 100000 #define SIZE 1024
原始计算方法
__u16 crc_itu_t_byte(__u16 crc,const __u8 data) { return (crc << 8) ^ crc_itu_t_table[((crc >> 8) ^ data) & 0xff]; } __u16 gCrc16(__u16 crc,const __u8 *buffer,__u32 len) { while((len > 0) && (buffer != NULL)) { crc = crc_itu_t_byte(crc,*buffer); buffer = buffer + 1; len = len - ; } return crc; }
测试耗时
old_tv tv_sec 4404 tv_usec 74838 tv tv_sec 4409 tv_usec 856335 tv_usec 5781497
优化方式一
编译器优化选项
CFLAGS := -O2
测试耗时
4450 tv_usec 3520774451 tv_usec 4899801137903
优化方式二
去掉指针判断
__u16 gCrc16(__u16 crc,1)">while(len > 0) { crc = crc_itu_t_byte(crc,1)">4487 tv_usec 7172174488 tv_usec 647959930742
优化方式三
使用inline关键字
inline __u16 gCrc16(__u16 crc,1)"> crc; }
4603 tv_usec 7985034604 tv_usec 6208207705
CRC采用64K查表法
WORD LibCrc16_2(const BYTE *pbyData,DWORD dwSize) { WORD wCRC = 0x0000; DWORD dwIndex; WORD wValue; DWORD dwLen = (dwSize >> 1) << ; for(dwIndex = 0; dwIndex < dwLen; dwIndex += 2) { wValue = pbyData[dwIndex] << 8 | pbyData[dwIndex + ]; wCRC = g_wLibCrc16_2_Table[wCRC ^ wValue]; } dwLen = dwSize % if(dwLen == ) { wCRC = (wCRC << 8) ^ g_wLibCrc16Table[((wCRC >> 8) & 0xff) ^ pbyData[dwSize - ]]; } wCRC; }
测试耗时
4731 tv_usec 352502807167454665
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。