spacepaste

  1.  
  2. /*
  3. 1 argument(s):
  4. 0
  5. 3 argument(s):
  6. 10
  7. 20
  8. 30
  9. 9 argument(s):
  10. 1
  11. 2
  12. 3
  13. 4
  14. 5
  15. 6
  16. 7
  17. 8
  18. 9
  19. cpu time: 0.00 seconds
  20. cpu time: 0.36 seconds
  21. cpu time: 0.000 seconds
  22. cpu time: 0.360 seconds
  23. cpu time: 0.344 seconds
  24. cpu time: 0.331 seconds
  25. total cpu time: 1.035 seconds
  26. total real cpu time: 1.035 seconds
  27. */
  28. #include <stdio.h>
  29. #include <stdarg.h>
  30. /*
  31. clock__total(
  32. clock__get(whereis_start),
  33. clock__get(whereis_end),
  34. clock__get(create_start),
  35. clock__get(create_end),
  36. clock__get(build_start),
  37. clock__get(build_end),
  38. clock__get(link_start),
  39. clock__get(link_end),
  40. clock__get(run_start),
  41. clock__get(run_end),
  42. clock__get(delete_start),
  43. clock__get(delete_end));
  44. */
  45. #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
  46. /* C99-style: anonymous argument referenced by __VA_ARGS__, empty arg not OK */
  47. # define N_ARGS(...) N_ARGS_HELPER1(__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
  48. # define N_ARGS_HELPER1(...) N_ARGS_HELPER2(__VA_ARGS__)
  49. # define N_ARGS_HELPER2(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, n, ...) n
  50. # define foo(...) foo_helper(N_ARGS(__VA_ARGS__), __VA_ARGS__)
  51. # define clock__total(...) clock__total_h(N_ARGS(__VA_ARGS__), __VA_ARGS__)
  52. #elif defined(__GNUC__)
  53. /* GCC-style: named argument, empty arg is OK */
  54. # define N_ARGS(args...) N_ARGS_HELPER1(args, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
  55. # define N_ARGS_HELPER1(args...) N_ARGS_HELPER2(args)
  56. # define N_ARGS_HELPER2(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, n, x...) n
  57. # define foo(args...) foo_helper(N_ARGS(args), args)
  58. # define clock__total(args...) clock_total__h(N_ARGS(args), args)
  59. #else
  60. #error variadic macros for your compiler here
  61. #endif
  62. static inline void foo_helper(unsigned int n_args, ...)
  63. {
  64. unsigned int i, arg;
  65. va_list ap;
  66. va_start(ap, n_args);
  67. printf("%u argument(s):\n", n_args);
  68. for (i = 0; i < n_args; i++) {
  69. arg = va_arg(ap, unsigned int);
  70. printf(" %u\n", arg);
  71. }
  72. va_end(ap);
  73. }
  74. #include <time.h>
  75. #include <stdbool.h>
  76. bool has_time = false;
  77. #define clock__get(clock) builtin_clock_##clock
  78. #define clock__add(clocka) clock_t clock__get(clocka) = 0
  79. #define clock__calculate(clock_start, clock_end) (double)(clock__get(clock_end) - clock__get(clock_start)) / CLOCKS_PER_SEC
  80. #define clock__set(clockb) clock__get(clockb) = clock()
  81. clock__add(timefunc_start);
  82. clock__add(timefunc_end);
  83. #define timefunc(func) { \
  84. clock__set(timefunc_start); \
  85. func; \
  86. clock__set(timefunc_end); \
  87. printf("cpu time: %.2f seconds\n", clock__calculate(timefunc_start, timefunc_end)); \
  88. }
  89. #include <stdio.h>
  90. #include <stdlib.h>
  91. #include <unistd.h>
  92. clock__add (base);
  93. #define clock__init() clock__set(base)
  94. static inline void clock__total_h(unsigned int n_args, ...)
  95. {
  96. unsigned int i;
  97. clock__add(arg1);
  98. clock__add(arg2);
  99. clock__add(total_last);
  100. clock__add(total_current);
  101. clock__add(largest);
  102. clock__get(total_last) = 0;
  103. clock__get(total_current) = 0;
  104. va_list ap;
  105. va_start(ap, n_args);
  106. for (i = 0; i < n_args; i++) {
  107. clock__get(total_current) += clock__get(arg2) - clock__get(arg1);
  108. clock__get(arg1) = va_arg(ap, clock_t);
  109. if (clock__get(arg1)>clock__get(largest)) clock__get(largest)=clock__get(arg1);
  110. clock__get(arg2) = va_arg(ap, clock_t);
  111. if (clock__get(arg2)>clock__get(largest)) clock__get(largest)=clock__get(arg2);
  112. clock__get(total_last) = clock__get(arg1) - clock__get(arg2);
  113. printf("cpu time: %.3f seconds\n", clock__calculate(arg1, arg2));
  114. i++;
  115. }
  116. printf("total cpu time: %.3f seconds\n", clock__calculate(total_last, total_current));
  117. printf("total real cpu time: %.3f seconds\n", clock__calculate(base, largest));
  118. va_end(ap);
  119. }
  120. #include <unistd.h>
  121. #define fc(x) builtin_clock_##x##_end
  122. int main(void)
  123. {
  124. clock__set(base);
  125. clock__add(a);
  126. clock__add(b);
  127. clock__set(a);
  128. foo(0);
  129. foo(10, 20, 30);
  130. foo(1, 2, 3, 4, 5, 6, 7, 8, 9);
  131. clock__set(b);
  132. printf("cpu time: %.2f seconds\n", clock__calculate(a, b));
  133. timefunc(sleep(1))
  134. clock__add(sleep1);
  135. clock__add(sleep2);
  136. clock__add(sleep3);
  137. clock__add(sleep4);
  138. clock__set(sleep1);
  139. sleep(1);
  140. clock__set(sleep2);
  141. clock__set(sleep3);
  142. sleep(1);
  143. clock__set(sleep4);
  144. clock__total(clock__get(a), clock__get(b), clock__get(timefunc_start), fc(timefunc), clock__get(sleep1),clock__get(sleep2),clock__get(sleep3),clock__get(sleep4));
  145. return 0;
  146. }
  147.