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@1:66996d5c4b7c, 2016-04-23 (annotated)
- Committer:
- manitou
- Date:
- Sat Apr 23 14:22:56 2016 +0000
- Revision:
- 1:66996d5c4b7c
- Parent:
- 0:d4f8f8fee9db
add validation
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 | 1:66996d5c4b7c | 23 | // validation |
manitou | 1:66996d5c4b7c | 24 | void printva(char * name, uint32_t check, uint32_t val){ |
manitou | 1:66996d5c4b7c | 25 | printf("%s",name); |
manitou | 1:66996d5c4b7c | 26 | if (check == val) |
manitou | 1:66996d5c4b7c | 27 | printf(" is ok"); |
manitou | 1:66996d5c4b7c | 28 | else |
manitou | 1:66996d5c4b7c | 29 | printf(" is NOT ok"); |
manitou | 1:66996d5c4b7c | 30 | printf("\n"); |
manitou | 1:66996d5c4b7c | 31 | } |
manitou | 1:66996d5c4b7c | 32 | |
manitou | 1:66996d5c4b7c | 33 | void validate() { |
manitou | 1:66996d5c4b7c | 34 | uint32_t crc; |
manitou | 1:66996d5c4b7c | 35 | uint8_t buf[9] = {'1','2','3','4','5','6','7','8','9'}; |
manitou | 1:66996d5c4b7c | 36 | |
manitou | 1:66996d5c4b7c | 37 | |
manitou | 1:66996d5c4b7c | 38 | printf("CRC Validation\n"); |
manitou | 1:66996d5c4b7c | 39 | |
manitou | 1:66996d5c4b7c | 40 | crc = CRC8.smbus(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 41 | printva("SMBUS", 0xf4, crc); |
manitou | 1:66996d5c4b7c | 42 | |
manitou | 1:66996d5c4b7c | 43 | crc = CRC8.maxim(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 44 | printva("Maxim", 0xa1, crc); |
manitou | 1:66996d5c4b7c | 45 | |
manitou | 1:66996d5c4b7c | 46 | crc = CRC16.ccitt(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 47 | printva("CCITT", 0x29b1, crc); |
manitou | 1:66996d5c4b7c | 48 | |
manitou | 1:66996d5c4b7c | 49 | crc = CRC16.mcrf4xx(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 50 | printva("MCRF4XX", 0x6f91, crc); |
manitou | 1:66996d5c4b7c | 51 | |
manitou | 1:66996d5c4b7c | 52 | crc = CRC16.modbus(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 53 | printva("MODBUS", 0x4b37, crc); |
manitou | 1:66996d5c4b7c | 54 | |
manitou | 1:66996d5c4b7c | 55 | crc = CRC16.kermit(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 56 | printva("KERMIT", 0x2189, crc); |
manitou | 1:66996d5c4b7c | 57 | |
manitou | 1:66996d5c4b7c | 58 | crc = CRC16.xmodem(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 59 | printva("XMODEM", 0x31c3, crc); |
manitou | 1:66996d5c4b7c | 60 | |
manitou | 1:66996d5c4b7c | 61 | crc = CRC16.x25(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 62 | printva("X.25", 0x906e, crc); |
manitou | 1:66996d5c4b7c | 63 | |
manitou | 1:66996d5c4b7c | 64 | crc = CRC32.crc32(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 65 | printva("CRC32", 0xcbf43926, crc); |
manitou | 1:66996d5c4b7c | 66 | |
manitou | 1:66996d5c4b7c | 67 | crc = CRC32.cksum(buf, sizeof(buf)); |
manitou | 1:66996d5c4b7c | 68 | printva("CKSUM", 0x765e7680, crc); |
manitou | 1:66996d5c4b7c | 69 | } |
manitou | 1:66996d5c4b7c | 70 | |
manitou | 0:d4f8f8fee9db | 71 | |
manitou | 0:d4f8f8fee9db | 72 | // Supporting functions for Software CRC |
manitou | 0:d4f8f8fee9db | 73 | |
manitou | 0:d4f8f8fee9db | 74 | inline uint16_t softcrc(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 75 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 76 | seed = _crc16_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 77 | } |
manitou | 0:d4f8f8fee9db | 78 | return seed; |
manitou | 0:d4f8f8fee9db | 79 | } |
manitou | 0:d4f8f8fee9db | 80 | |
manitou | 0:d4f8f8fee9db | 81 | inline uint16_t softcrcIbutton(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 82 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 83 | seed = _crc_ibutton_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 84 | } |
manitou | 0:d4f8f8fee9db | 85 | return seed; |
manitou | 0:d4f8f8fee9db | 86 | } |
manitou | 0:d4f8f8fee9db | 87 | |
manitou | 0:d4f8f8fee9db | 88 | inline uint16_t softcrcCCIT(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 89 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 90 | seed = _crc_ccitt_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 91 | } |
manitou | 0:d4f8f8fee9db | 92 | return seed; |
manitou | 0:d4f8f8fee9db | 93 | } |
manitou | 0:d4f8f8fee9db | 94 | |
manitou | 0:d4f8f8fee9db | 95 | inline uint16_t softcrcXMODEM(uint16_t seed, uint8_t *data, uint16_t datalen) { |
manitou | 0:d4f8f8fee9db | 96 | for (uint16_t i=0; i<datalen; i++) { |
manitou | 0:d4f8f8fee9db | 97 | seed = _crc_xmodem_update(seed, data[i]); |
manitou | 0:d4f8f8fee9db | 98 | } |
manitou | 0:d4f8f8fee9db | 99 | return seed; |
manitou | 0:d4f8f8fee9db | 100 | } |
manitou | 0:d4f8f8fee9db | 101 | |
manitou | 0:d4f8f8fee9db | 102 | |
manitou | 0:d4f8f8fee9db | 103 | void printVals(char * name, uint32_t crc, uint32_t time) { |
manitou | 0:d4f8f8fee9db | 104 | printf("%s Value:0x%x, Time: %d us\n",name,crc,time); |
manitou | 0:d4f8f8fee9db | 105 | } |
manitou | 0:d4f8f8fee9db | 106 | |
manitou | 0:d4f8f8fee9db | 107 | main() { |
manitou | 0:d4f8f8fee9db | 108 | uint32_t time; |
manitou | 0:d4f8f8fee9db | 109 | uint32_t crc; |
manitou | 0:d4f8f8fee9db | 110 | |
manitou | 0:d4f8f8fee9db | 111 | tmr.start(); |
manitou | 0:d4f8f8fee9db | 112 | printf("\nSystemCoreClock %d %s %s\n",SystemCoreClock,__TIME__,__DATE__); |
manitou | 1:66996d5c4b7c | 113 | validate(); |
manitou | 1:66996d5c4b7c | 114 | printf("\nCRC Benchmark %d bytes\n",sizeof(buf)); |
manitou | 0:d4f8f8fee9db | 115 | |
manitou | 0:d4f8f8fee9db | 116 | //Fill array with data |
manitou | 0:d4f8f8fee9db | 117 | for (int i=0; i<BUFSIZE; i++) { |
manitou | 0:d4f8f8fee9db | 118 | buf[i] = (i+1) & 0xff; |
manitou | 0:d4f8f8fee9db | 119 | } |
manitou | 0:d4f8f8fee9db | 120 | |
manitou | 0:d4f8f8fee9db | 121 | |
manitou | 0:d4f8f8fee9db | 122 | time = micros(); |
manitou | 0:d4f8f8fee9db | 123 | crc = CRC8.maxim(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 124 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 125 | printVals("Maxim (iButton) FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 126 | |
manitou | 0:d4f8f8fee9db | 127 | time = micros(); |
manitou | 0:d4f8f8fee9db | 128 | crc = softcrcIbutton(0, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 129 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 130 | printVals("Maxim (iButton) builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 131 | |
manitou | 0:d4f8f8fee9db | 132 | |
manitou | 0:d4f8f8fee9db | 133 | time = micros(); |
manitou | 0:d4f8f8fee9db | 134 | crc = CRC16.modbus(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 135 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 136 | printVals("MODBUS FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 137 | |
manitou | 0:d4f8f8fee9db | 138 | time = micros(); |
manitou | 0:d4f8f8fee9db | 139 | crc = softcrc(0xffff, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 140 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 141 | printVals("MODBUS builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 142 | |
manitou | 0:d4f8f8fee9db | 143 | |
manitou | 0:d4f8f8fee9db | 144 | time = micros(); |
manitou | 0:d4f8f8fee9db | 145 | crc = CRC16.xmodem(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 146 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 147 | printVals("XMODEM FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 148 | |
manitou | 0:d4f8f8fee9db | 149 | time = micros(); |
manitou | 0:d4f8f8fee9db | 150 | crc = softcrcXMODEM(0, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 151 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 152 | printVals("XMODEM builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 153 | |
manitou | 0:d4f8f8fee9db | 154 | time = micros(); |
manitou | 0:d4f8f8fee9db | 155 | crc = CRC16.mcrf4xx(buf,BUFSIZE); |
manitou | 0:d4f8f8fee9db | 156 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 157 | printVals("MCRF4XX FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 158 | |
manitou | 0:d4f8f8fee9db | 159 | time = micros(); |
manitou | 0:d4f8f8fee9db | 160 | crc = softcrcCCIT(0xffff, buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 161 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 162 | printVals("MCRF4XX builtin:",crc,time); |
manitou | 0:d4f8f8fee9db | 163 | |
manitou | 0:d4f8f8fee9db | 164 | |
manitou | 0:d4f8f8fee9db | 165 | time = micros(); |
manitou | 0:d4f8f8fee9db | 166 | crc = CRC16.kermit(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 167 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 168 | printVals("KERMIT FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 169 | |
manitou | 0:d4f8f8fee9db | 170 | time = micros(); |
manitou | 0:d4f8f8fee9db | 171 | crc = CRC32.crc32(buf, BUFSIZE); |
manitou | 0:d4f8f8fee9db | 172 | time = micros() - time; |
manitou | 0:d4f8f8fee9db | 173 | printVals("Ethernet FastCRC:",crc,time); |
manitou | 0:d4f8f8fee9db | 174 | } |