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@0:d4f8f8fee9db, 2016-04-22 (annotated)
- Committer:
- manitou
- Date:
- Fri Apr 22 09:55:23 2016 +0000
- Revision:
- 0:d4f8f8fee9db
- Child:
- 1:66996d5c4b7c
performance test of FastCRC lib
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
manitou | 0:d4f8f8fee9db | 1 | // test FastCRC performance, hardware vs avr softcrc |
manitou | 0:d4f8f8fee9db | 2 | //FastCRC |
manitou | 0:d4f8f8fee9db | 3 | //Benchmark |
manitou | 0:d4f8f8fee9db | 4 | // |
manitou | 0:d4f8f8fee9db | 5 | //(c) Frank Boesing 2014 |
manitou | 0:d4f8f8fee9db | 6 | |
manitou | 0:d4f8f8fee9db | 7 | #include "mbed.h" |
manitou | 0:d4f8f8fee9db | 8 | #include "FastCRC.h" |
manitou | 0:d4f8f8fee9db | 9 | #include "crc16.h" |
manitou | 0:d4f8f8fee9db | 10 | |
manitou | 0:d4f8f8fee9db | 11 | Timer tmr; |
manitou | 0:d4f8f8fee9db | 12 | #define micros tmr.read_us |
manitou | 0:d4f8f8fee9db | 13 | |
manitou | 0:d4f8f8fee9db | 14 | #define BUFSIZE 16384 |
manitou | 0:d4f8f8fee9db | 15 | |
manitou | 0:d4f8f8fee9db | 16 | |
manitou | 0:d4f8f8fee9db | 17 | FastCRC8 CRC8; |
manitou | 0:d4f8f8fee9db | 18 | FastCRC16 CRC16; |
manitou | 0:d4f8f8fee9db | 19 | FastCRC32 CRC32; |
manitou | 0:d4f8f8fee9db | 20 | |
manitou | 0:d4f8f8fee9db | 21 | uint8_t buf[BUFSIZE] __attribute__((aligned(4))); |
manitou | 0:d4f8f8fee9db | 22 | |
manitou | 0:d4f8f8fee9db | 23 | |
manitou | 0:d4f8f8fee9db | 24 | // Supporting functions for Software CRC |
manitou | 0:d4f8f8fee9db | 25 | |
manitou | 0:d4f8f8fee9db | 26 | inline uint16_t softcrc(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 27 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 28 | seed = _crc16_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 29 | } |
manitou | 0:d4f8f8fee9db | 30 | return seed; |
manitou | 0:d4f8f8fee9db | 31 | } |
manitou | 0:d4f8f8fee9db | 32 | |
manitou | 0:d4f8f8fee9db | 33 | inline uint16_t softcrcIbutton(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 34 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 35 | seed = _crc_ibutton_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 36 | } |
manitou | 0:d4f8f8fee9db | 37 | return seed; |
manitou | 0:d4f8f8fee9db | 38 | } |
manitou | 0:d4f8f8fee9db | 39 | |
manitou | 0:d4f8f8fee9db | 40 | inline uint16_t softcrcCCIT(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 41 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 42 | seed = _crc_ccitt_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 43 | } |
manitou | 0:d4f8f8fee9db | 44 | return seed; |
manitou | 0:d4f8f8fee9db | 45 | } |
manitou | 0:d4f8f8fee9db | 46 | |
manitou | 0:d4f8f8fee9db | 47 | inline uint16_t softcrcXMODEM(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 48 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 49 | seed = _crc_xmodem_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 50 | } |
manitou | 0:d4f8f8fee9db | 51 | return seed; |
manitou | 0:d4f8f8fee9db | 52 | } |
manitou | 0:d4f8f8fee9db | 53 | |
manitou | 0:d4f8f8fee9db | 54 | |
manitou | 0:d4f8f8fee9db | 55 | void printVals(char * name, uint32_t crc, uint32_t time) { |
manitou | 0:d4f8f8fee9db | 56 | printf("%s Value:0x%x, Time: %d us\n",name,crc,time); |
manitou | 0:d4f8f8fee9db | 57 | } |
manitou | 0:d4f8f8fee9db | 58 | |
manitou | 0:d4f8f8fee9db | 59 | main() { |
manitou | 0:d4f8f8fee9db | 60 | uint32_t time; |
manitou | 0:d4f8f8fee9db | 61 | uint32_t crc; |
manitou | 0:d4f8f8fee9db | 62 | |
manitou | 0:d4f8f8fee9db | 63 | tmr.start(); |
manitou | 0:d4f8f8fee9db | 64 | printf("\nSystemCoreClock %d %s %s\n",SystemCoreClock,__TIME__,__DATE__); |
manitou | 0:d4f8f8fee9db | 65 | printf("CRC Benchmark %d bytes\n",sizeof(buf)); |
manitou | 0:d4f8f8fee9db | 66 | |
manitou | 0:d4f8f8fee9db | 67 | //Fill array with data |
manitou | 0:d4f8f8fee9db | 68 | for (int i=0; i<BUFSIZE; i++) { |
manitou | 0:d4f8f8fee9db | 69 | buf[i] = (i+1) & 0xff; |
manitou | 0:d4f8f8fee9db | 70 | } |
manitou | 0:d4f8f8fee9db | 71 | |
manitou | 0:d4f8f8fee9db | 72 | |
manitou | 0:d4f8f8fee9db | 73 | time = micros(); |
manitou | 0:d4f8f8fee9db | 74 | crc = CRC8.maxim(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 75 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 76 | printVals("Maxim (iButton) FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 77 | |
manitou | 0:d4f8f8fee9db | 78 | time = micros(); |
manitou | 0:d4f8f8fee9db | 79 | crc = softcrcIbutton(0, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 80 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 81 | printVals("Maxim (iButton) builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 82 | |
manitou | 0:d4f8f8fee9db | 83 | |
manitou | 0:d4f8f8fee9db | 84 | time = micros(); |
manitou | 0:d4f8f8fee9db | 85 | crc = CRC16.modbus(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 86 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 87 | printVals("MODBUS FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 88 | |
manitou | 0:d4f8f8fee9db | 89 | time = micros(); |
manitou | 0:d4f8f8fee9db | 90 | crc = softcrc(0xffff, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 91 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 92 | printVals("MODBUS builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 93 | |
manitou | 0:d4f8f8fee9db | 94 | |
manitou | 0:d4f8f8fee9db | 95 | time = micros(); |
manitou | 0:d4f8f8fee9db | 96 | crc = CRC16.xmodem(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 97 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 98 | printVals("XMODEM FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 99 | |
manitou | 0:d4f8f8fee9db | 100 | time = micros(); |
manitou | 0:d4f8f8fee9db | 101 | crc = softcrcXMODEM(0, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 102 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 103 | printVals("XMODEM builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 104 | |
manitou | 0:d4f8f8fee9db | 105 | time = micros(); |
manitou | 0:d4f8f8fee9db | 106 | crc = CRC16.mcrf4xx(buf,BUFSIZE); |
manitou | 0:d4f8f8fee9db | 107 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 108 | printVals("MCRF4XX FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 109 | |
manitou | 0:d4f8f8fee9db | 110 | time = micros(); |
manitou | 0:d4f8f8fee9db | 111 | crc = softcrcCCIT(0xffff, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 112 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 113 | printVals("MCRF4XX builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 114 | |
manitou | 0:d4f8f8fee9db | 115 | |
manitou | 0:d4f8f8fee9db | 116 | time = micros(); |
manitou | 0:d4f8f8fee9db | 117 | crc = CRC16.kermit(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 118 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 119 | printVals("KERMIT FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 120 | |
manitou | 0:d4f8f8fee9db | 121 | time = micros(); |
manitou | 0:d4f8f8fee9db | 122 | crc = CRC32.crc32(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 123 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 124 | printVals("Ethernet FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 125 | } |