Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- /*
- gcc -O3
- sample.bin:50000003
- c1: 50000003
- sub1: 0.030000 seconds
- c2: 50000003
- sub2: 0.090000 seconds
- wcl386 /onkhtx bittest.c
- c1: 50000003
- sub1: 0.156000 seconds
- c2: 50000003
- sub2: 0.109000 seconds
- cl /O2 bittest.c
- c1: 50000003
- sub1: 0.310000 seconds
- c2: 50000003
- sub2: 0.068000 seconds
- */
- #define E_1 59
- #define E_2 60
- #define E_3 61
- #define E_4 62
- #define E_5 63
- #define E_6 64
- #define E_7 65
- #define E_8 66
- #define E_9 67
- #define E_10 68
- #define E_11 69
- #define E_12 70
- #define E_13 71
- #define E_14 72
- #define E_15 73
- #define E_16 74
- #define E_17 75
- #define E_18 76
- void sub1(char *);
- void sub2(char *, int *);
- int bitset1[8];
- int size;
- char *data;
- int main(int argc, const char **argv)
- {
- FILE *fh;
- clock_t t0;
- clock_t t1;
- fh = fopen(argv[1], "rb");
- if (fh == NULL) {
- printf("err1: %s\n", argv[1]);
- exit(EXIT_FAILURE);
- }
- fseek(fh, 0L, SEEK_END);
- size = ftell(fh);
- fseek(fh, 0L, SEEK_SET);
- data = malloc(size + 1);
- size = fread(data, 1, size, fh);
- fclose(fh);
- if (size <= 0) {
- printf("err2: %d\n", size);
- exit(EXIT_FAILURE);
- }
- printf("%s:%d\n", argv[1], size);
- /*------------------------------------------------------------------------*/
- bitset1[E_1 / 32] |= 1 << E_1 % 32;
- bitset1[E_2 / 32] |= 1 << E_2 % 32;
- bitset1[E_3 / 32] |= 1 << E_3 % 32;
- bitset1[E_4 / 32] |= 1 << E_4 % 32;
- bitset1[E_5 / 32] |= 1 << E_5 % 32;
- bitset1[E_6 / 32] |= 1 << E_6 % 32;
- bitset1[E_7 / 32] |= 1 << E_7 % 32;
- bitset1[E_8 / 32] |= 1 << E_8 % 32;
- bitset1[E_9 / 32] |= 1 << E_9 % 32;
- bitset1[E_10 / 32] |= 1 << E_10 % 32;
- bitset1[E_11 / 32] |= 1 << E_11 % 32;
- bitset1[E_12 / 32] |= 1 << E_12 % 32;
- bitset1[E_13 / 32] |= 1 << E_13 % 32;
- bitset1[E_14 / 32] |= 1 << E_14 % 32;
- bitset1[E_15 / 32] |= 1 << E_15 % 32;
- bitset1[E_16 / 32] |= 1 << E_16 % 32;
- bitset1[E_17 / 32] |= 1 << E_17 % 32;
- bitset1[E_18 / 32] |= 1 << E_18 % 32;
- t0 = clock();
- sub1(data);
- t1 = clock();
- printf("sub1: %f seconds\n", (double)(t1 - t0) / CLOCKS_PER_SEC);
- t0 = clock();
- sub2(data, bitset1);
- t1 = clock();
- printf("sub2: %f seconds\n", (double)(t1 - t0) / CLOCKS_PER_SEC);
- return 0;
- }
- void sub1(char *data)
- {
- int i = 0;
- while (
- data[i] != E_1 &&
- data[i] != E_2 &&
- data[i] != E_3 &&
- data[i] != E_4 &&
- data[i] != E_5 &&
- data[i] != E_6 &&
- data[i] != E_7 &&
- data[i] != E_8 &&
- data[i] != E_9 &&
- data[i] != E_10 &&
- data[i] != E_11 &&
- data[i] != E_12 &&
- data[i] != E_13 &&
- data[i] != E_14 &&
- data[i] != E_15 &&
- data[i] != E_16 &&
- data[i] != E_17 &&
- data[i] != E_18
- ) {
- i++;
- if (i >= size)
- break;
- }
- printf("c1: %d\n", i);
- }
- void sub2(char *data, int *bitset)
- {
- int i = 0;
- while (!(bitset[data[i] / 32] & 1 << data[i] % 32)) {
- i++;
- if (i >= size)
- break;
- }
- printf("c2: %d\n", i);
- }
Advertisement
Add Comment
Please, Sign In to add comment