zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    士兵杀死(两)(南阳116)
    Android 墙纸设置代码 详细说明
    Laravel nginx 伪静态规则
    STL源代码分析——STL算法merge合并算法
    第29周六
    第29周五
    第29周四
    第29周三
    2014第29周二
    第29周一
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/13754103.html
Copyright © 2011-2022 走看看