CRC计算性能分析

测试环境介绍

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 - 1;
   }

   return crc;
}
复制代码

测试耗时

old_tv tv_sec 4404 tv_usec 74838
tv tv_sec 4409 tv_usec 856335
tv_usec 5781497

优化方式一

编译器优化选项

CFLAGS := -O2

测试耗时

old_tv tv_sec 4450 tv_usec 352077
tv tv_sec 4451 tv_usec 489980
tv_usec 1137903

优化方式二

去掉指针判断

复制代码
__u16 gCrc16(__u16 crc, const __u8 *buffer, __u32 len)
{
   while(len > 0)
   {
      crc = crc_itu_t_byte(crc, *buffer);
      buffer = buffer + 1;

      len = len - 1;
   }

   return crc;
}
复制代码

测试耗时

old_tv tv_sec 4487 tv_usec 717217
tv tv_sec 4488 tv_usec 647959
tv_usec 930742

优化方式三

使用inline关键字

复制代码
inline __u16 gCrc16(__u16 crc, const __u8 *buffer, __u32 len)
{
   while(len > 0)
   {
      crc = crc_itu_t_byte(crc, *buffer);
      buffer = buffer + 1;

      len = len - 1;
   }

   return crc;
}
复制代码
测试耗时
old_tv tv_sec 4603 tv_usec 798503
tv tv_sec 4604 tv_usec 6208
tv_usec 207705

CRC采用64K查表法

复制代码
WORD LibCrc16_2(const BYTE *pbyData, DWORD dwSize)
{
   WORD wCRC = 0x0000;
   DWORD dwIndex;
   WORD wValue;
   DWORD dwLen = (dwSize >> 1) << 1;

   for(dwIndex = 0; dwIndex < dwLen; dwIndex += 2)
   {
      wValue = pbyData[dwIndex] << 8 | pbyData[dwIndex + 1];
      wCRC = g_wLibCrc16_2_Table[wCRC ^ wValue];
   }

   dwLen = dwSize % 2;

   if(dwLen == 1)
   {
      wCRC = (wCRC << 8) ^ g_wLibCrc16Table[((wCRC >> 8) & 0xff) ^ pbyData[dwSize - 1]];
   }

   return wCRC;
}
复制代码

测试耗时

old_tv tv_sec 4731 tv_usec 352502
tv tv_sec 4731 tv_usec 807167
tv_usec 454665
posted @   thomas_blog  阅读(727)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示