Branch data Line data Source code
1 : : // This file is a part of Julia. License is MIT: https://julialang.org/license 2 : : 3 : : #include <inttypes.h> 4 : : #include "julia.h" 5 : : #include "julia_internal.h" 6 : : #include "options.h" 7 : : #include "stdio.h" 8 : : 9 : : #ifdef __cplusplus 10 : : extern "C" { 11 : : #endif 12 : : 13 : : #ifdef ENABLE_TIMINGS 14 : : #include "timing.h" 15 : : 16 : : #ifndef HAVE_TIMING_SUPPORT 17 : : #error Timings are not supported on your compiler 18 : : #endif 19 : : 20 : : static uint64_t t0; 21 : : JL_DLLEXPORT uint64_t jl_timing_data[(int)JL_TIMING_LAST] = {0}; 22 : : const char *jl_timing_names[(int)JL_TIMING_LAST] = 23 : : { 24 : : #define X(name) #name 25 : : JL_TIMING_OWNERS 26 : : #undef X 27 : : }; 28 : : 29 : : void jl_print_timings(void) 30 : : { 31 : : uint64_t total_time = cycleclock() - t0; 32 : : uint64_t root_time = total_time; 33 : : for (int i = 0; i < JL_TIMING_LAST; i++) { 34 : : root_time -= jl_timing_data[i]; 35 : : } 36 : : jl_timing_data[0] = root_time; 37 : : for (int i = 0; i < JL_TIMING_LAST; i++) { 38 : : if (jl_timing_data[i] != 0) 39 : : fprintf(stderr, "%-25s : %5.2f %% %" PRIu64 "\n", jl_timing_names[i], 40 : : 100 * (((double)jl_timing_data[i]) / total_time), jl_timing_data[i]); 41 : : } 42 : : } 43 : : 44 : : void jl_init_timing(void) 45 : : { 46 : : t0 = cycleclock(); 47 : : } 48 : : 49 : : void jl_destroy_timing(void) 50 : : { 51 : : jl_ptls_t ptls = jl_current_task->ptls; 52 : : jl_timing_block_t *stack = ptls->timing_stack; 53 : : while (stack) { 54 : : _jl_timing_block_destroy(stack); 55 : : stack = stack->prev; 56 : : } 57 : : } 58 : : 59 : : jl_timing_block_t *jl_pop_timing_block(jl_timing_block_t *cur_block) 60 : : { 61 : : _jl_timing_block_destroy(cur_block); 62 : : return cur_block->prev; 63 : : } 64 : : 65 : : void jl_timing_block_start(jl_timing_block_t *cur_block) 66 : : { 67 : : _jl_timing_block_start(cur_block, cycleclock()); 68 : : } 69 : : 70 : : void jl_timing_block_stop(jl_timing_block_t *cur_block) 71 : : { 72 : : _jl_timing_block_stop(cur_block, cycleclock()); 73 : : } 74 : : 75 : : #else 76 : : 77 : 15 : void jl_init_timing(void) { } 78 : 15 : void jl_destroy_timing(void) { } 79 : : 80 : : #endif 81 : : 82 : : #ifdef __cplusplus 83 : : } 84 : : #endif