/* 1 argument(s): 0 3 argument(s): 10 20 30 9 argument(s): 1 2 3 4 5 6 7 8 9 cpu time: 0.00 seconds cpu time: 0.36 seconds cpu time: 0.000 seconds cpu time: 0.360 seconds cpu time: 0.344 seconds cpu time: 0.331 seconds total cpu time: 1.035 seconds total real cpu time: 1.035 seconds */ #include #include /* clock__total( clock__get(whereis_start), clock__get(whereis_end), clock__get(create_start), clock__get(create_end), clock__get(build_start), clock__get(build_end), clock__get(link_start), clock__get(link_end), clock__get(run_start), clock__get(run_end), clock__get(delete_start), clock__get(delete_end)); */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99-style: anonymous argument referenced by __VA_ARGS__, empty arg not OK */ # define N_ARGS(...) N_ARGS_HELPER1(__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) # define N_ARGS_HELPER1(...) N_ARGS_HELPER2(__VA_ARGS__) # define N_ARGS_HELPER2(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, n, ...) n # define foo(...) foo_helper(N_ARGS(__VA_ARGS__), __VA_ARGS__) # define clock__total(...) clock__total_h(N_ARGS(__VA_ARGS__), __VA_ARGS__) #elif defined(__GNUC__) /* GCC-style: named argument, empty arg is OK */ # define N_ARGS(args...) N_ARGS_HELPER1(args, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) # define N_ARGS_HELPER1(args...) N_ARGS_HELPER2(args) # define N_ARGS_HELPER2(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, n, x...) n # define foo(args...) foo_helper(N_ARGS(args), args) # define clock__total(args...) clock_total__h(N_ARGS(args), args) #else #error variadic macros for your compiler here #endif static inline void foo_helper(unsigned int n_args, ...) { unsigned int i, arg; va_list ap; va_start(ap, n_args); printf("%u argument(s):\n", n_args); for (i = 0; i < n_args; i++) { arg = va_arg(ap, unsigned int); printf(" %u\n", arg); } va_end(ap); } #include #include bool has_time = false; #define clock__get(clock) builtin_clock_##clock #define clock__add(clocka) clock_t clock__get(clocka) = 0 #define clock__calculate(clock_start, clock_end) (double)(clock__get(clock_end) - clock__get(clock_start)) / CLOCKS_PER_SEC #define clock__set(clockb) clock__get(clockb) = clock() clock__add(timefunc_start); clock__add(timefunc_end); #define timefunc(func) { \ clock__set(timefunc_start); \ func; \ clock__set(timefunc_end); \ printf("cpu time: %.2f seconds\n", clock__calculate(timefunc_start, timefunc_end)); \ } #include #include #include clock__add (base); #define clock__init() clock__set(base) static inline void clock__total_h(unsigned int n_args, ...) { unsigned int i; clock__add(arg1); clock__add(arg2); clock__add(total_last); clock__add(total_current); clock__add(largest); clock__get(total_last) = 0; clock__get(total_current) = 0; va_list ap; va_start(ap, n_args); for (i = 0; i < n_args; i++) { clock__get(total_current) += clock__get(arg2) - clock__get(arg1); clock__get(arg1) = va_arg(ap, clock_t); if (clock__get(arg1)>clock__get(largest)) clock__get(largest)=clock__get(arg1); clock__get(arg2) = va_arg(ap, clock_t); if (clock__get(arg2)>clock__get(largest)) clock__get(largest)=clock__get(arg2); clock__get(total_last) = clock__get(arg1) - clock__get(arg2); printf("cpu time: %.3f seconds\n", clock__calculate(arg1, arg2)); i++; } printf("total cpu time: %.3f seconds\n", clock__calculate(total_last, total_current)); printf("total real cpu time: %.3f seconds\n", clock__calculate(base, largest)); va_end(ap); } #include #define fc(x) builtin_clock_##x##_end int main(void) { clock__set(base); clock__add(a); clock__add(b); clock__set(a); foo(0); foo(10, 20, 30); foo(1, 2, 3, 4, 5, 6, 7, 8, 9); clock__set(b); printf("cpu time: %.2f seconds\n", clock__calculate(a, b)); timefunc(sleep(1)) clock__add(sleep1); clock__add(sleep2); clock__add(sleep3); clock__add(sleep4); clock__set(sleep1); sleep(1); clock__set(sleep2); clock__set(sleep3); sleep(1); clock__set(sleep4); 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)); return 0; }