Advertisement
Guest User

Untitled

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