Guest User

Untitled

a guest
Jun 22nd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1.  
  2.  
  3.  
  4.  
  5.  
  6. #include <map>
  7. #include <string>
  8.  
  9. #include <iostream>
  10. #ifdef WIN32
  11. #include <Windows.h>
  12. #else
  13. #include <sys/time.h> // for gettimeofday()
  14. #endif
  15.  
  16.  
  17. #include <stdint.h> /* Replace with <stdint.h> if appropriate */
  18. #undef get16bits
  19. #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
  20. || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
  21. #define get16bits(d) (*((const uint16_t *) (d)))
  22. #endif
  23.  
  24. #if !defined (get16bits)
  25. #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
  26. +(uint32_t)(((const uint8_t *)(d))[0]) )
  27. #endif
  28.  
  29. uint32_t SuperFastHash (const char * data, int len) {
  30. uint32_t hash = len, tmp;
  31. int rem;
  32.  
  33. if (len <= 0 || data == NULL) return 0;
  34.  
  35. rem = len & 3;
  36. len >>= 2;
  37.  
  38. /* Main loop */
  39. for (;len > 0; len--) {
  40. hash += get16bits (data);
  41. tmp = (get16bits (data+2) << 11) ^ hash;
  42. hash = (hash << 16) ^ tmp;
  43. data += 2*sizeof (uint16_t);
  44. hash += hash >> 11;
  45. }
  46.  
  47. /* Handle end cases */
  48. switch (rem) {
  49. case 3: hash += get16bits (data);
  50. hash ^= hash << 16;
  51. hash ^= data[sizeof (uint16_t)] << 18;
  52. hash += hash >> 11;
  53. break;
  54. case 2: hash += get16bits (data);
  55. hash ^= hash << 11;
  56. hash += hash >> 17;
  57. break;
  58. case 1: hash += *data;
  59. hash ^= hash << 10;
  60. hash += hash >> 1;
  61. }
  62.  
  63. /* Force "avalanching" of final 127 bits */
  64. hash ^= hash << 3;
  65. hash += hash >> 5;
  66. hash ^= hash << 4;
  67. hash += hash >> 17;
  68. hash ^= hash << 25;
  69. hash += hash >> 6;
  70.  
  71. return hash;
  72. }
  73.  
  74.  
  75.  
  76.  
  77. #define sz 300000
  78.  
  79. int main()
  80. {
  81. std::map<uint32_t, char*> redis;
  82. char ** buffer = new char*[sz];
  83. for(int i=0; i<sz; i++)
  84. {
  85. buffer[i] = new char[8];
  86. sprintf(buffer[i], "%i", i);
  87.  
  88. }
  89. char * buffer2 = "OHAI LOL";
  90. char * buffer3 = NULL;
  91.  
  92. #ifdef WIN32
  93. LARGE_INTEGER frequency; // ticks per second
  94. LARGE_INTEGER t1, t2; // ticks
  95. #else
  96. timeval t1, t2;
  97. #endif
  98. double elapsedTime;
  99.  
  100. // start timer
  101. #ifdef WIN32
  102. QueryPerformanceFrequency(&frequency);
  103.  
  104. // start timer
  105. QueryPerformanceCounter(&t1);
  106. #else
  107. gettimeofday(&t1, NULL);
  108. #endif
  109.  
  110. for(int i=0; i<sz; i++)
  111. {
  112. redis[SuperFastHash(buffer[i],strlen(buffer[i]))] = buffer2;
  113. }
  114.  
  115.  
  116.  
  117. // stop timer
  118. #ifdef WIN32
  119. QueryPerformanceCounter(&t2);
  120. #else
  121. gettimeofday(&t2, NULL);
  122. #endif
  123.  
  124. // compute and print the elapsed time in millisec
  125. #ifdef WIN32
  126. elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;
  127. #else
  128. elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; // sec to ms
  129. elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0; // us to ms
  130. #endif
  131. std::cout << (double)sz/(elapsedTime/1000.0) << " sets/second"<<std::endl;
  132.  
  133.  
  134. #ifdef WIN32
  135. QueryPerformanceFrequency(&frequency);
  136.  
  137. // start timer
  138. QueryPerformanceCounter(&t1);
  139. #else
  140. gettimeofday(&t1, NULL);
  141. #endif
  142.  
  143. for(int i=0; i<sz; i++)
  144. {
  145. buffer3 = redis[SuperFastHash(buffer[i],strlen(buffer[i]))];
  146. //std::cout<<buffer3;
  147. }
  148.  
  149.  
  150.  
  151. // stop timer
  152. #ifdef WIN32
  153. QueryPerformanceCounter(&t2);
  154. #else
  155. gettimeofday(&t2, NULL);
  156. #endif
  157.  
  158. #ifdef WIN32
  159. elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;
  160. #else
  161. elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0; // sec to ms
  162. elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0; // us to ms
  163. #endif
  164. std::cout << (double)sz/(elapsedTime/1000.0) << " gets/second"<<std::endl;
  165.  
  166.  
  167. system("PAUSE");
  168.  
  169. return 0;
  170. }
Add Comment
Please, Sign In to add comment