@@ -2381,7 +2381,7 @@ JL_DLLEXPORT void jl_force_trace_compile_timing_disable(void)
23812381 jl_atomic_fetch_add (& jl_force_trace_compile_timing_enabled , -1 );
23822382}
23832383
2384- static void record_precompile_statement (jl_method_instance_t * mi , double compilation_time )
2384+ static void record_precompile_statement (jl_method_instance_t * mi , double compilation_time , double codegen_latch_waiting_time )
23852385{
23862386 static ios_t f_precompile ;
23872387 static JL_STREAM * s_precompile = NULL ;
@@ -2412,10 +2412,23 @@ static void record_precompile_statement(jl_method_instance_t *mi, double compila
24122412 }
24132413 if (!jl_has_free_typevars (mi -> specTypes )) {
24142414 if (force_trace_compile || jl_options .trace_compile_timing )
2415- jl_printf (s_precompile , "#= %6.1f;nested:%d; =# " , compilation_time / 1e6 , nested_level );
2415+ jl_printf (s_precompile , "#= %6.1f =# " , compilation_time / 1e6 );
24162416 jl_printf (s_precompile , "precompile(" );
24172417 jl_static_show (s_precompile , mi -> specTypes );
2418- jl_printf (s_precompile , ")\n" );
2418+ jl_printf (s_precompile , ")" );
2419+
2420+ // compilation inline properties/files as a json dictionary
2421+ if (force_trace_compile || jl_options .trace_compile_timing ){
2422+ jl_printf (s_precompile , " #= { " ); // json starts
2423+ // nested level: 0 -> not nested, >= 1, nested amount
2424+ jl_printf (s_precompile , "\"nested_levels\": %d, " , nested_level );
2425+ // time spent waiting to acquire the codegen latch, in milliseconds
2426+ jl_printf (s_precompile , "\"codegen_waiting_time\": %.2f " , codegen_latch_waiting_time / 1e6 );
2427+
2428+ jl_printf (s_precompile , "} =#" ); // json ends
2429+ }
2430+ jl_printf (s_precompile , "\n" );
2431+
24192432 if (s_precompile != JL_STDERR )
24202433 ios_flush (& f_precompile );
24212434 }
@@ -2575,7 +2588,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
25752588 codeinst -> rettype_const = unspec -> rettype_const ;
25762589 jl_atomic_store_release (& codeinst -> invoke , unspec_invoke );
25772590 jl_mi_cache_insert (mi , codeinst );
2578- record_precompile_statement (mi , 0 );
2591+ record_precompile_statement (mi , 0 , 0 );
25792592 return codeinst ;
25802593 }
25812594 }
@@ -2592,7 +2605,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
25922605 0 , 1 , ~(size_t )0 , 0 , 0 , jl_nothing , 0 );
25932606 jl_atomic_store_release (& codeinst -> invoke , jl_fptr_interpret_call );
25942607 jl_mi_cache_insert (mi , codeinst );
2595- record_precompile_statement (mi , 0 );
2608+ record_precompile_statement (mi , 0 , 0 );
25962609 return codeinst ;
25972610 }
25982611 if (compile_option == JL_OPTIONS_COMPILE_OFF ) {
@@ -2604,7 +2617,9 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
26042617
26052618 double compile_time = jl_hrtime ();
26062619 int did_compile = 0 ;
2620+ uint64_t codegen_latch_wt_before = jl_current_task -> lock_waiting_time ;
26072621 codeinst = jl_generate_fptr (mi , world , & did_compile );
2622+ uint64_t codegen_latch_waiting_time = jl_current_task -> lock_waiting_time - codegen_latch_wt_before ;
26082623 compile_time = jl_hrtime () - compile_time ;
26092624
26102625 if (!codeinst ) {
@@ -2647,7 +2662,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
26472662 jl_mi_cache_insert (mi , codeinst );
26482663 }
26492664 else if (did_compile ) {
2650- record_precompile_statement (mi , compile_time );
2665+ record_precompile_statement (mi , compile_time , ( double ) codegen_latch_waiting_time );
26512666 }
26522667 jl_atomic_store_relaxed (& codeinst -> precompile , 1 );
26532668 return codeinst ;
0 commit comments