Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <assert.h>
- #include <stdint.h>
- #include <stdlib.h>
- #include <time.h>
- char lut[256];
- int hextoint_lut(char x) {
- return lut[uint8_t(x)];
- }
- int hextoint_cond(char x) {
- uint32_t dig = x - '0';
- uint32_t alp = dig + ('0' - 'a' + 10);
- return dig <= 9U ? dig : alp;
- }
- int hextoint_cond2(char x) {
- uint32_t offset = (uint8_t(x) <= uint8_t('9') ? '0' : 'a' - 10);
- return uint8_t(x) - offset;
- }
- int hextoint_bit(char x) {
- int b = uint8_t(x);
- int mask = (('9' - b) >> 31);
- int offset = '0' + (mask & int('a' - '0' - 10));
- return b - offset;
- }
- int hextoint_bit_ci(char x) {
- int b = uint8_t(x);
- int maskLetter = (('9' - b) >> 31);
- int maskSmall = (('Z' - b) >> 31);
- int offset = '0' + (maskLetter & int('A' - '0' - 10)) + (maskSmall & int('a' - 'A'));
- return b - offset;
- }
- int main() {
- const char all[] = {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- 'a', 'b', 'c', 'd', 'e', 'f',
- 'A', 'B', 'C', 'D', 'E', 'F'
- };
- const char idx[] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15,
- 10, 11, 12, 13, 14, 15
- };
- for (int i = 0; i < 22; i++)
- lut[uint8_t(all[i])] = idx[i];
- for (int i = 0; i < 16; i++)
- assert(idx[i] == hextoint_lut(all[i]));
- for (int i = 0; i < 16; i++)
- assert(idx[i] == hextoint_cond(all[i]));
- for (int i = 0; i < 16; i++)
- assert(idx[i] == hextoint_cond2(all[i]));
- for (int i = 0; i < 16; i++)
- assert(idx[i] == hextoint_bit(all[i]));
- for (int i = 0; i < 22; i++)
- assert(idx[i] == hextoint_bit_ci(all[i]));
- static const int VALUES = 64<<10;
- static const int TRIES = 16<<10;
- static const double FREQ = 3.4e+9; //Note write your CPU's frequency here
- #define BENCHMARK(func, data) { \
- int sum = 0; \
- int start = clock(); \
- for (int i = 0; i < TRIES; i++) \
- for (int j = 0; j < VALUES; j+=8) { \
- sum += func(data[j + 0]); \
- sum += func(data[j + 1]); \
- sum += func(data[j + 2]); \
- sum += func(data[j + 3]); \
- sum += func(data[j + 4]); \
- sum += func(data[j + 5]); \
- sum += func(data[j + 6]); \
- sum += func(data[j + 7]); \
- } \
- double elapsed = double(clock() - start) / CLOCKS_PER_SEC; \
- double cycles = elapsed / TRIES / VALUES * FREQ; \
- printf("%s: %0.3lf sec, %0.1lf cycles (check: %d)\n", \
- #func, elapsed, cycles, sum); \
- }
- char input[VALUES];
- for (int i = 0; i < VALUES; i++)
- input[i] = all[rand() % 16];
- BENCHMARK(hextoint_lut, input);
- BENCHMARK(hextoint_cond, input);
- BENCHMARK(hextoint_cond2, input);
- BENCHMARK(hextoint_bit, input);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement