diff --git a/src/gf.c b/src/gf.c index 7f338b31ccb4a..ed4ac118c61ad 100644 --- a/src/gf.c +++ b/src/gf.c @@ -2933,14 +2933,19 @@ STATIC_INLINE jl_method_instance_t *jl_lookup_generic_(jl_value_t *F, jl_value_t JL_DLLEXPORT jl_value_t *jl_apply_generic(jl_value_t *F, jl_value_t **args, uint32_t nargs) { size_t world = jl_current_task->world_age; +#ifdef JL_DISPATCH_LOG_BOXES + uint64_t t0 = jl_hrtime(); +#endif jl_method_instance_t *mfunc = jl_lookup_generic_(F, args, nargs, jl_int32hash_fast(jl_return_address()), world); JL_GC_PROMISE_ROOTED(mfunc); + #ifdef JL_DISPATCH_LOG_BOXES jl_method_t *def = mfunc->def.method; if (jl_is_method(def)) { def->num_dynamic_dispatches++; + def->dynamic_dispatch_ns += (jl_hrtime() - t0); } #endif return _jl_invoke(F, args, nargs, mfunc, world); @@ -2951,12 +2956,21 @@ JL_DLLEXPORT uint64_t jl_get_num_dynamic_dispatches(jl_method_t *m) { return m->num_dynamic_dispatches; } +JL_DLLEXPORT uint64_t jl_get_dynamic_dispatch_ns(jl_method_t *m) +{ + return m->dynamic_dispatch_ns; +} #else JL_DLLEXPORT uint64_t jl_get_num_dynamic_dispatches(jl_method_t *m) { jl_error("not logging"); return 0; } +JL_DLLEXPORT uint64_t jl_get_dynamic_dispatch_ns(jl_method_t *m) +{ + jl_error("not logging"); + return 0; +} #endif static jl_method_match_t *_gf_invoke_lookup(jl_value_t *types JL_PROPAGATES_ROOT, jl_value_t *mt, size_t world, size_t *min_valid, size_t *max_valid) diff --git a/src/jltypes.c b/src/jltypes.c index e7c1fd9d9c9c2..9bbaba1882242 100644 --- a/src/jltypes.c +++ b/src/jltypes.c @@ -2600,7 +2600,7 @@ void jl_init_types(void) JL_GC_DISABLED jl_method_type = jl_new_datatype(jl_symbol("Method"), core, jl_any_type, jl_emptysvec, - jl_perm_symsvec(30, + jl_perm_symsvec(31, "name", "module", "file", @@ -2630,8 +2630,9 @@ void jl_init_types(void) JL_GC_DISABLED "is_for_opaque_closure", "constprop", "purity", - "num_dynamic_dispatches"), - jl_svec(30, + "num_dynamic_dispatches", + "dynamic_dispatch_ns"), + jl_svec(31, jl_symbol_type, jl_module_type, jl_symbol_type, @@ -2661,7 +2662,8 @@ void jl_init_types(void) JL_GC_DISABLED jl_bool_type, jl_uint8_type, jl_uint8_type, - jl_int32_type), + jl_int32_type, + jl_uint64_type), jl_emptysvec, 0, 1, 10); //const static uint32_t method_constfields[1] = { 0x03fc065f }; // (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<6)|(1<<9)|(1<<10)|(1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)|(1<<25); diff --git a/src/julia.h b/src/julia.h index 8db3b7225e24a..0fb6113402ffe 100644 --- a/src/julia.h +++ b/src/julia.h @@ -349,6 +349,7 @@ typedef struct _jl_method_t { _jl_purity_overrides_t purity; uint32_t num_dynamic_dispatches; + uint64_t dynamic_dispatch_ns; // hidden fields: // lock for modifications to the method diff --git a/src/method.c b/src/method.c index c5e595fa75719..e70b0a159f179 100644 --- a/src/method.c +++ b/src/method.c @@ -807,6 +807,7 @@ JL_DLLEXPORT jl_method_t *jl_new_method_uninit(jl_module_t *module) m->constprop = 0; #ifdef JL_DISPATCH_LOG_BOXES m->num_dynamic_dispatches = 0; + m->dynamic_dispatch_ns = 0; #endif JL_MUTEX_INIT(&m->writelock); return m;