Advertisement
Guest User

Untitled

a guest
Jun 20th, 2014
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/time.h>
  4.  
  5. const int MILLION = 1000 * 1000;
  6. const int N = 10 * 1000 * 1000;
  7. const int TRIALS = 19;
  8. const unsigned int SEED = 123456789;
  9.  
  10. static long nowUsec()
  11. {
  12. struct timeval t;
  13. gettimeofday(&t, NULL);
  14. return t.tv_sec * MILLION + t.tv_usec;
  15. }
  16.  
  17. // Internal
  18.  
  19. static int internal_compare(const void* x, const void* y)
  20. {
  21. int a = *(int*) x;
  22. int b = *(int*) y;
  23. return a < b ? -1 : a > b ? 1 : 0;
  24. }
  25.  
  26. static int* internalGenerateData(int n)
  27. {
  28. srand(SEED);
  29. int* data = (int*) malloc(sizeof(int) * n);
  30. for (int i = 0; i < n; i++) {
  31. data[i] = rand();
  32. }
  33. return data;
  34. }
  35.  
  36. static void internalSort(int* data, int n)
  37. {
  38. qsort(data, n, sizeof(int), internal_compare);
  39. }
  40.  
  41. static long internalTimeScanUsec(int* data, int n, int trials, int* xor)
  42. {
  43. long start = nowUsec();
  44. for (int t = 0; t < trials; t++) {
  45. for (int i = 0; i < n; i++) {
  46. *xor = *xor ^ data[i];
  47. }
  48. }
  49. long stop = nowUsec();
  50. return stop - start;
  51. }
  52.  
  53. static void testInternal()
  54. {
  55. int* data = internalGenerateData(N);
  56. internalSort(data, N);
  57. int xor = 0;
  58. long usec = internalTimeScanUsec(data, N, TRIALS, &xor);
  59. double average = (double) usec / TRIALS;
  60. printf("INTERNAL time/scan (usec): %f\t\txor: %d\n", average, xor);
  61. }
  62.  
  63. // External sorted
  64.  
  65. static int external_compare(const void* x, const void* y)
  66. {
  67. int a = **(int**) x;
  68. int b = **(int**) y;
  69. return a < b ? -1 : a > b ? 1 : 0;
  70. }
  71.  
  72. static int** externalGenerateData(int n)
  73. {
  74. srand(SEED);
  75. int** pointers = (int**) malloc(sizeof(int*) * n);
  76. int* data = (int*) malloc(sizeof(int) * n);
  77. for (int i = 0; i < n; i++) {
  78. data[i] = rand();
  79. pointers[i] = &data[i];
  80. }
  81. return pointers;
  82. }
  83.  
  84. static void externalSort(int** pointers, int n)
  85. {
  86. qsort(pointers, n, sizeof(int*), external_compare);
  87. }
  88.  
  89. static long externalTimeScanUsec(int** pointers, int n, int trials, int* xor)
  90. {
  91. long start = nowUsec();
  92. for (int t = 0; t < trials; t++) {
  93. for (int i = 0; i < n; i++) {
  94. *xor = *xor ^ *pointers[i];
  95. }
  96. }
  97. long stop = nowUsec();
  98. return stop - start;
  99. }
  100.  
  101. static void testExternal()
  102. {
  103. int** pointers = externalGenerateData(N);
  104. int xor = 0;
  105. long usecUnsorted = externalTimeScanUsec(pointers, N, TRIALS, &xor);
  106. double averageUnsorted = (double) usecUnsorted / TRIALS;
  107. printf("EXTERNAL UNSORTED time/scan (usec): %f\t\txor: %d\n", averageUnsorted, xor);
  108. externalSort(pointers, N);
  109. xor = 0;
  110. long usecSorted = externalTimeScanUsec(pointers, N, TRIALS, &xor);
  111. double averageSorted = (double) usecSorted / TRIALS;
  112. printf("EXTERNAL SORTED time/scan (usec): %f\t\txor: %d\n", averageSorted, xor);
  113. printf("SORTED/UNSORTED: %f\n", averageSorted / averageUnsorted);
  114. }
  115.  
  116. // main
  117.  
  118. int main(int argc, const char * argv[])
  119. {
  120. testInternal();
  121. testExternal();
  122. return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement