performance test of FastCRC lib, compare hardware CRC with Arduino software CRC (crc16.h) and table driven implementation
performance test of FastCRC lib, ref https://github.com/FrankBoesing/FastCRC
Teensy 3.2 @120MHz mbed K64F @120MHz hardware CRC hardware CRC Maxim (iButton) FastCRC: Value:0xF6, Time: 275 us. Maxim (iButton) FastCRC: Value:0xf6, Time: 275 us Maxim (iButton) builtin: Value:0xF6, Time: 9994 us. Maxim (iButton) builtin: Value:0xf6, Time: 7100 us MODBUS FastCRC: Value:0x7029, Time: 275 us. MODBUS FastCRC: Value:0x7029, Time: 275 us MODBUS builtin: Value:0x7029, Time: 9584 us. MODBUS builtin: Value:0x7029, Time: 7100 us XMODEM FastCRC: Value:0x98D9, Time: 275 us. XMODEM FastCRC: Value:0x98d9, Time: 275 us XMODEM builtin: Value:0x98D9, Time: 10542 us. XMODEM builtin: Value:0x98d9, Time: 8193 us MCRF4XX FastCRC: Value:0x4A29, Time: 275 us. MCRF4XX FastCRC: Value:0x4a29, Time: 275 us MCRF4XX builtin: Value:0x4A29, Time: 1783 us. MCRF4XX builtin: Value:0x4a29, Time: 1639 us KERMIT FastCRC: Value:0xB259, Time: 279 us. KERMIT FastCRC: Value:0xb259, Time: 275 us Ethernet FastCRC: Value:0x1271457F, Time: 275 us. Ethernet FastCRC: Value:0x1271457f, Time: 275 us table-driven CRC table-driven CRC Maxim (iButton) FastCRC: Value:0xF6, Time: 1329 us. Maxim (iButton) FastCRC: Value:0xf6, Time: 997 us Maxim (iButton) builtin: Value:0xF6, Time: 9994 us. Maxim (iButton) builtin: Value:0xf6, Time: 7101 us MODBUS FastCRC: Value:0x7029, Time: 2226 us. MODBUS FastCRC: Value:0x7029, Time: 1623 us MODBUS builtin: Value:0x7029, Time: 9584 us. MODBUS builtin: Value:0x7029, Time: 7101 us XMODEM FastCRC: Value:0x98D9, Time: 2102 us. XMODEM FastCRC: Value:0x98d9, Time: 1608 us XMODEM builtin: Value:0x98D9, Time: 10542 us. XMODEM builtin: Value:0x98d9, Time: 8193 us MCRF4XX FastCRC: Value:0x4A29, Time: 2185 us. MCRF4XX FastCRC: Value:0x4a29, Time: 1664 us MCRF4XX builtin: Value:0x4A29, Time: 1782 us. MCRF4XX builtin: Value:0x4a29, Time: 1639 us KERMIT FastCRC: Value:0xB259, Time: 2190 us. KERMIT FastCRC: Value:0xb259, Time: 1650 us Ethernet FastCRC: Value:0x38D32145, Time: 2090 us. Ethernet FastCRC: Value:0x38d32145, Time: 1702 us
main.cpp
- Committer:
- manitou
- Date:
- 2016-04-23
- Revision:
- 1:66996d5c4b7c
- Parent:
- 0:d4f8f8fee9db
File content as of revision 1:66996d5c4b7c:
// test FastCRC performance, hardware vs avr softcrc //FastCRC //Benchmark // //(c) Frank Boesing 2014 #include "mbed.h" #include "FastCRC.h" #include "crc16.h" Timer tmr; #define micros tmr.read_us #define BUFSIZE 16384 FastCRC8 CRC8; FastCRC16 CRC16; FastCRC32 CRC32; uint8_t buf[BUFSIZE] __attribute__((aligned(4))); // validation void printva(char * name, uint32_t check, uint32_t val){ printf("%s",name); if (check == val) printf(" is ok"); else printf(" is NOT ok"); printf("\n"); } void validate() { uint32_t crc; uint8_t buf[9] = {'1','2','3','4','5','6','7','8','9'}; printf("CRC Validation\n"); crc = CRC8.smbus(buf, sizeof(buf)); printva("SMBUS", 0xf4, crc); crc = CRC8.maxim(buf, sizeof(buf)); printva("Maxim", 0xa1, crc); crc = CRC16.ccitt(buf, sizeof(buf)); printva("CCITT", 0x29b1, crc); crc = CRC16.mcrf4xx(buf, sizeof(buf)); printva("MCRF4XX", 0x6f91, crc); crc = CRC16.modbus(buf, sizeof(buf)); printva("MODBUS", 0x4b37, crc); crc = CRC16.kermit(buf, sizeof(buf)); printva("KERMIT", 0x2189, crc); crc = CRC16.xmodem(buf, sizeof(buf)); printva("XMODEM", 0x31c3, crc); crc = CRC16.x25(buf, sizeof(buf)); printva("X.25", 0x906e, crc); crc = CRC32.crc32(buf, sizeof(buf)); printva("CRC32", 0xcbf43926, crc); crc = CRC32.cksum(buf, sizeof(buf)); printva("CKSUM", 0x765e7680, crc); } // Supporting functions for Software CRC inline uint16_t softcrc(uint16_t seed, uint8_t *data, uint16_t datalen) { for (uint16_t i=0; i<datalen; i++) { seed = _crc16_update(seed, data[i]); } return seed; } inline uint16_t softcrcIbutton(uint16_t seed, uint8_t *data, uint16_t datalen) { for (uint16_t i=0; i<datalen; i++) { seed = _crc_ibutton_update(seed, data[i]); } return seed; } inline uint16_t softcrcCCIT(uint16_t seed, uint8_t *data, uint16_t datalen) { for (uint16_t i=0; i<datalen; i++) { seed = _crc_ccitt_update(seed, data[i]); } return seed; } inline uint16_t softcrcXMODEM(uint16_t seed, uint8_t *data, uint16_t datalen) { for (uint16_t i=0; i<datalen; i++) { seed = _crc_xmodem_update(seed, data[i]); } return seed; } void printVals(char * name, uint32_t crc, uint32_t time) { printf("%s Value:0x%x, Time: %d us\n",name,crc,time); } main() { uint32_t time; uint32_t crc; tmr.start(); printf("\nSystemCoreClock %d %s %s\n",SystemCoreClock,__TIME__,__DATE__); validate(); printf("\nCRC Benchmark %d bytes\n",sizeof(buf)); //Fill array with data for (int i=0; i<BUFSIZE; i++) { buf[i] = (i+1) & 0xff; } time = micros(); crc = CRC8.maxim(buf, BUFSIZE); time = micros() - time; printVals("Maxim (iButton) FastCRC:",crc,time); time = micros(); crc = softcrcIbutton(0, buf, BUFSIZE); time = micros() - time; printVals("Maxim (iButton) builtin:",crc,time); time = micros(); crc = CRC16.modbus(buf, BUFSIZE); time = micros() - time; printVals("MODBUS FastCRC:",crc,time); time = micros(); crc = softcrc(0xffff, buf, BUFSIZE); time = micros() - time; printVals("MODBUS builtin:",crc,time); time = micros(); crc = CRC16.xmodem(buf, BUFSIZE); time = micros() - time; printVals("XMODEM FastCRC:",crc,time); time = micros(); crc = softcrcXMODEM(0, buf, BUFSIZE); time = micros() - time; printVals("XMODEM builtin:",crc,time); time = micros(); crc = CRC16.mcrf4xx(buf,BUFSIZE); time = micros() - time; printVals("MCRF4XX FastCRC:",crc,time); time = micros(); crc = softcrcCCIT(0xffff, buf, BUFSIZE); time = micros() - time; printVals("MCRF4XX builtin:",crc,time); time = micros(); crc = CRC16.kermit(buf, BUFSIZE); time = micros() - time; printVals("KERMIT FastCRC:",crc,time); time = micros(); crc = CRC32.crc32(buf, BUFSIZE); time = micros() - time; printVals("Ethernet FastCRC:",crc,time); }