Guest User

Untitled

a guest
Oct 21st, 2013
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.47 KB | None | 0 0
  1. #include <assert.h>
  2. #include <db_185.h>
  3. #include <dlfcn.h>
  4.  
  5. #include <fcntl.h>
  6. #include <stdio.h>
  7. #include <stdint.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <sys/stat.h>
  11. #include <sys/time.h>
  12. #include <sys/types.h>
  13.  
  14. #include <Judy.h>
  15.  
  16. typedef uint32_t ITEMTYPE;
  17. #define SETSIZE 300000
  18.  
  19. #define NRUNS   2000000
  20.  
  21.  
  22. static void
  23. bdb_test(ITEMTYPE *set, DBTYPE dbtype, void *dbinfo)
  24. {
  25.     size_t i;
  26.     DB *db;
  27.     DBT key, data;
  28.     ITEMTYPE sample;
  29.  
  30.     struct timeval begin, end;
  31.  
  32.     db = dbopen(NULL, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, dbtype, dbinfo);
  33.  
  34.     data.data = NULL;
  35.     data.size = 0;
  36.     key.size = sizeof(ITEMTYPE);
  37.     for (i=0; i<SETSIZE; i++) {
  38.         key.data = &set[i];
  39.         db->put(db, &key, &data, 0);
  40.     }
  41.  
  42.     gettimeofday(&begin, NULL);
  43.     key.data = &sample;
  44.     for (i=0; i<NRUNS; i++) {
  45.         sample = rand();
  46.         db->get(db, &key, &data, 0);
  47.     }
  48.     gettimeofday(&end, NULL);
  49.     printf("%f secs\n", ((double)((end.tv_sec - begin.tv_sec)*1000000 + end.tv_usec - begin.tv_usec)) / 1000000.0);
  50.     db->close(db);
  51. }
  52.  
  53. static int
  54. cmp_func(const void *p1, const void *p2)
  55. {
  56.     ITEMTYPE *a = (ITEMTYPE *)p1;
  57.     ITEMTYPE *b = (ITEMTYPE *)p2;
  58.     return *a - *b;
  59. }
  60.  
  61. static void
  62. bsearch_test(ITEMTYPE *setsample)
  63. {
  64.     size_t i;
  65.     ITEMTYPE *set;
  66.     struct timeval begin, end;
  67.  
  68.     set = malloc(SETSIZE * sizeof(ITEMTYPE));
  69.     assert(set != NULL);
  70.     memcpy(set, setsample, SETSIZE * sizeof(ITEMTYPE));
  71.  
  72.     qsort(set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  73.  
  74.     printf("bsearch: ");
  75.  
  76.     gettimeofday(&begin, NULL);
  77.     for (i=0; i<NRUNS; i++) {
  78.         ITEMTYPE sample, *res;
  79.  
  80.         sample = rand();
  81.         res = bsearch(&sample, set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  82.     }
  83.     gettimeofday(&end, NULL);
  84.     printf("%f secs\n", ((double)((end.tv_sec - begin.tv_sec)*1000000 + end.tv_usec - begin.tv_usec)) / 1000000.0);
  85.     free(set);
  86. }
  87.  
  88.  
  89. static int
  90. bsearch_opt_search(const ITEMTYPE *arr, ITEMTYPE n, ITEMTYPE key, int niters)
  91. {
  92.     int min = 0, max = n, middle;
  93.     size_t i, iters;
  94.  
  95.     iters = niters;
  96.  
  97.     for (i=0; i<iters; i++) {
  98.         middle = (min + max) >> 1;
  99.         if (key > arr [middle]) min = middle + 1;
  100.         else max = middle;
  101.     }
  102.  
  103.     if (key != arr[min]) return -1;
  104.     return min;
  105. }
  106.  
  107. static int
  108. interpolation_search(const ITEMTYPE *set, ITEMTYPE n, ITEMTYPE key)
  109. {
  110.     int low = 0;
  111.     int high = n - 1;
  112.     int mid;
  113.  
  114.     int l = set[low];
  115.     int h = set[high];
  116.  
  117.     while (l <= key && h >= key) {
  118.         int m;
  119.         mid = low + (int64_t)((int64_t)(high - low)*(int64_t)(key - l))/((int64_t)(h-l));
  120. /*      mid = low + ((float)(high - low)*(float)(key - l))/(1+(float)(h-l));*/
  121.  
  122.         m = set[mid];
  123.  
  124.         if (m < key) {
  125.             l = set[low = mid + 1];
  126.         } else if (m > key) {
  127.             h = set[high = mid - 1];
  128.         } else {
  129.             return mid;
  130.         }
  131.     }
  132.  
  133.     if (set[low] == key)
  134.         return low;
  135.     else
  136.         return -1;
  137. }
  138.  
  139. static void
  140. interpolation_test(ITEMTYPE *setsample)
  141. {
  142.     size_t i;
  143.     ITEMTYPE *set;
  144.     struct timeval begin, end;
  145.     int acc = 0;
  146.  
  147.     set = malloc(SETSIZE * sizeof(ITEMTYPE));
  148.     assert(set != NULL);
  149.     memcpy(set, setsample, SETSIZE * sizeof(ITEMTYPE));
  150.  
  151.     qsort(set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  152.  
  153.     printf("interpolation: ");
  154.  
  155.     gettimeofday(&begin, NULL);
  156.     for (i=0; i<NRUNS; i++) {
  157.         ITEMTYPE sample, *sres;
  158.         int ridx;
  159.  
  160.         sample = rand();
  161.  
  162.         ridx = interpolation_search(set, SETSIZE, sample);
  163.         if (ridx > 0) acc += ridx;
  164.  
  165. #if 0
  166.         sres = bsearch(&sample, set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  167.         if (!sres) {
  168.             continue;
  169.         }
  170.  
  171.         if (*sres != set[ridx]) {
  172.             fprintf(stderr, "incorrect i-search, step %u: %u != %u (sample: %u)\n", i, *sres, set[ridx], sample);
  173.             exit(1);
  174.         }
  175. #endif
  176.     }
  177.     gettimeofday(&end, NULL);
  178.     printf("%f secs, acc %d\n", ((double)((end.tv_sec - begin.tv_sec)*1000000 + end.tv_usec - begin.tv_usec)) / 1000000.0, acc);
  179.     free(set);
  180. }
  181.  
  182. static void
  183. bsearch_opt_test(ITEMTYPE *setsample)
  184. {
  185.     size_t i;
  186.     ITEMTYPE *set;
  187.     struct timeval begin, end;
  188.     int acc = 0, niters;
  189.  
  190.     set = malloc(SETSIZE * sizeof(ITEMTYPE));
  191.     assert(set != NULL);
  192.     memcpy(set, setsample, SETSIZE * sizeof(ITEMTYPE));
  193.  
  194.     qsort(set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  195.     niters = (sizeof(size_t) * CHAR_BIT) - __builtin_clz((size_t)SETSIZE);
  196.  
  197.     printf("hbsearch: ");
  198.  
  199.     gettimeofday(&begin, NULL);
  200.     for (i=0; i<NRUNS; i++) {
  201.         ITEMTYPE sample, *sres;
  202.         int ridx;
  203.  
  204.         sample = rand();
  205.  
  206.         ridx = bsearch_opt_search(set, SETSIZE, sample, niters);
  207.         if (ridx > 0) acc += ridx;
  208.  
  209.     }
  210.     gettimeofday(&end, NULL);
  211.     printf("%f secs, acc %d\n", ((double)((end.tv_sec - begin.tv_sec)*1000000 + end.tv_usec - begin.tv_usec)) / 1000000.0, acc);
  212.     free(set);
  213. }
  214.  
  215. static void
  216. judy_test(ITEMTYPE *setsample)
  217. {
  218.     size_t i;
  219.     Pvoid_t PJ1Array = (Pvoid_t)NULL;
  220.     int jw;
  221.     ITEMTYPE *set;
  222.     struct timeval begin, end;
  223.  
  224.     set = malloc(SETSIZE * sizeof(ITEMTYPE));
  225.     assert(set != NULL);
  226.     memcpy(set, setsample, SETSIZE * sizeof(ITEMTYPE));
  227.  
  228.     qsort(set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  229.  
  230.     for (i=0; i<SETSIZE; i++) {
  231.         int pbit;
  232.         J1S(pbit, PJ1Array, set[i]);
  233.     }
  234.  
  235.     printf("judy: ");
  236.  
  237.     gettimeofday(&begin, NULL);
  238.     for (i=0; i<NRUNS; i++) {
  239.         ITEMTYPE sample, *sres;
  240.         int r;
  241.  
  242.         sample = rand();
  243.         J1T(r, PJ1Array, sample);
  244.  
  245. #if 0
  246.         sres = bsearch(&sample, set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  247.  
  248.         if (((sres == NULL) && (r > 0)) || ((sres != NULL) && (r == 0))) {
  249.             fprintf(stderr, "incorrect judy test, step %u, sample %u, r %d, sres %p\n", i, sample, r, (void *)sres);
  250.             exit(1);
  251.         }
  252. #endif
  253.     }
  254.     gettimeofday(&end, NULL);
  255.     printf("%f secs\n", ((double)((end.tv_sec - begin.tv_sec)*1000000 + end.tv_usec - begin.tv_usec)) / 1000000.0);
  256.     J1FA(jw, PJ1Array);
  257.     free(set);
  258. }
  259.  
  260. static void
  261. bitmap_test(ITEMTYPE *setsample)
  262. {
  263.     size_t i;
  264.     ITEMTYPE *set;
  265.     struct timeval begin, end;
  266.     uint32_t *bitmap;
  267.     int acc = 0;
  268.  
  269.     set = malloc(SETSIZE * sizeof(ITEMTYPE));
  270.     assert(set != NULL);
  271.     memcpy(set, setsample, SETSIZE * sizeof(ITEMTYPE));
  272.  
  273.     qsort(set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  274.  
  275.     bitmap = calloc(512*1024*1024, 1);
  276.  
  277.     for (i=0; i<SETSIZE; i++) {
  278.         bitmap[set[i] / 32] |= 1 << (set[i] % 32);
  279.     }
  280.  
  281.     printf("bitmap: ");
  282.  
  283.     gettimeofday(&begin, NULL);
  284.     for (i=0; i<NRUNS; i++) {
  285.         ITEMTYPE sample, *sres;
  286.         int r;
  287.  
  288.         sample = rand();
  289.         r = bitmap[sample / 32] & (1 << (sample % 32));
  290.         acc += r;
  291.  
  292. #if 0
  293.         sres = bsearch(&sample, set, SETSIZE, sizeof(ITEMTYPE), &cmp_func);
  294.  
  295.         if (((sres == NULL) && (r != 0)) || ((sres != NULL) && (r == 0))) {
  296.             fprintf(stderr, "incorrect judy test, step %u, sample %u, r %d, sres %p\n", i, sample, r, (void *)sres);
  297.             exit(1);
  298.         }
  299. #endif
  300.     }
  301.     gettimeofday(&end, NULL);
  302.     printf("%f secs, acc %d\n", ((double)((end.tv_sec - begin.tv_sec)*1000000 + end.tv_usec - begin.tv_usec)) / 1000000.0, acc);
  303.     free(bitmap);
  304.     free(set);
  305. }
  306.  
  307.  
  308.  
  309.  
  310. #define HTSIZE (1 << 16)
  311.  
  312. struct hbucket
  313. {
  314.     size_t nent;
  315.     ITEMTYPE *entries;
  316. };
  317.  
  318. static void
  319. hhash_test(ITEMTYPE *set)
  320. {
  321.     size_t i;
  322.     struct timeval begin, end;
  323.     struct hbucket hash_table[HTSIZE];
  324.     int acc = 0;
  325.  
  326.     memset(hash_table, 0, HTSIZE * sizeof(struct hbucket));
  327.  
  328.     for (i=0; i<SETSIZE; i++) {
  329.         uint16_t idx;
  330.  
  331.         /*idx = set[i] >> 16;*/
  332.         idx = set[i] & 0x0000ffff;
  333.         hash_table[idx].entries = realloc(hash_table[idx].entries, (hash_table[idx].nent + 1) * sizeof(ITEMTYPE *));
  334.         hash_table[idx].entries[hash_table[idx].nent] = set[i];
  335.         hash_table[idx].nent++;
  336.     }
  337.  
  338.     printf("hash: ");
  339.  
  340.     gettimeofday(&begin, NULL);
  341.     for (i=0; i<NRUNS; i++) {
  342.         ITEMTYPE sample;
  343.         uint16_t idx;
  344.         size_t j;
  345.  
  346.         sample = rand();
  347.         /*idx = sample >> 16;*/
  348.         idx = sample & 0x0000ffff;
  349.  
  350.         for (j=0; j<hash_table[idx].nent; j++) {
  351.             if (hash_table[idx].entries[j] == sample) {
  352.                 acc += sample;
  353.                 break;
  354.             }
  355.         }
  356.     }
  357.     gettimeofday(&end, NULL);
  358.     printf("%f secs\n", ((double)((end.tv_sec - begin.tv_sec)*1000000 + end.tv_usec - begin.tv_usec)) / 1000000.0);
  359.  
  360.     for (i=0; i<HTSIZE; i++) {
  361.         if (hash_table[i].nent > 0) free(hash_table[i].entries);
  362.     }
  363. }
  364.  
  365. int
  366. main()
  367. {
  368.     ITEMTYPE *set;
  369.     size_t i;
  370.  
  371.     BTREEINFO btree_info;
  372.     HASHINFO  hash_info;
  373.  
  374.     set = malloc(SETSIZE * sizeof(ITEMTYPE));
  375.     assert(set != NULL);
  376.  
  377.     for (i=0; i<SETSIZE; i++) {
  378.         set[i] = rand();
  379.     }
  380.  
  381.     judy_test(set);
  382.     bitmap_test(set);
  383.     hhash_test(set);
  384.     interpolation_test(set);
  385.     bsearch_opt_test(set);
  386.     bsearch_test(set);
  387.  
  388.     printf("BDB btree: ");
  389.     memset(&btree_info, 0, sizeof(BTREEINFO));
  390.     btree_info.cachesize = 100 * 1024 * 1024;
  391.     bdb_test(set, DB_BTREE, &btree_info);
  392.  
  393.     printf("BDB hash: ");
  394.     memset(&hash_info, 0, sizeof(HASHINFO));
  395.     hash_info.cachesize = 100 * 1024 * 1024;
  396.     bdb_test(set, DB_HASH, &hash_info);
  397.  
  398.     free(set);
  399.     return EXIT_SUCCESS;
  400. }
Advertisement
Add Comment
Please, Sign In to add comment