shaped up vm profiling by tracking the number of method cache hits/misses

This commit is contained in:
hyunghwan.chung 2019-09-27 03:41:03 +00:00
parent 9d74ec842f
commit c0b8048081
2 changed files with 40 additions and 17 deletions

View File

@ -1866,7 +1866,9 @@ moo_oop_method_t moo_findmethod (moo_t* moo, moo_oop_t receiver, moo_oop_char_t
if (mcitm->receiver_class == c && mcitm->selector == selector /*&& mcitm->method_type == mth_type*/)
{
/* cache hit */
/* TODO: moo->method_cache_hits++; */
#if defined(MOO_PROFILE_VM)
moo->stat.method_cache_hits++;
#endif
return mcitm->method;
}
@ -1874,7 +1876,9 @@ moo_oop_method_t moo_findmethod (moo_t* moo, moo_oop_t receiver, moo_oop_char_t
mth = find_method_in_class_chain(moo, c, mth_type, &message);
if (mth)
{
/* TODO: moo->method_cache_misses++; */
#if defined(MOO_PROFILE_VM)
moo->stat.method_cache_misses++;
#endif
mcitm->receiver_class = c;
mcitm->selector = selector;
/*mcitm->method_type = mth_type;*/
@ -1899,14 +1903,18 @@ not_found:
if (mcitm->receiver_class == _class && mcitm->selector == selector /*&& mcitm->method_type == MOO_METHOD_INSTANCE*/)
{
/* cache hit */
/* TODO: moo->method_cache_hits++; */
#if defined(MOO_PROFILE_VM)
moo->stat.method_cache_hits++;
#endif
return mcitm->method;
}
mth = find_method_in_class(moo, _class, MOO_METHOD_INSTANCE, &message);
if (mth)
{
/* TODO: moo->method_cache_misses++; */
#if defined(MOO_PROFILE_VM)
moo->stat.method_cache_misses++;
#endif
mcitm->receiver_class = c;
mcitm->selector = selector;
/*mcitm->method_type = MOO_METHOD_INSTANCE;*/
@ -2275,7 +2283,7 @@ static moo_pfrc_t pf_perform (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs)
MOO_STACK_POP (moo);
/* emulate message sending */
if (send_message (moo, (moo_oop_char_t)selector, nargs - 1, 0) <= -1) return MOO_PF_HARD_FAILURE;
if (send_message(moo, (moo_oop_char_t)selector, nargs - 1, 0) <= -1) return MOO_PF_HARD_FAILURE;
return MOO_PF_SUCCESS;
}
@ -4873,6 +4881,10 @@ static int send_message (moo_t* moo, moo_oop_char_t selector, moo_ooi_t nargs, i
receiver = MOO_STACK_GET(moo, moo->sp - nargs);
#if defined(MOO_PROFILE_VM)
moo->stat.message_sends++;
#endif
method = moo_findmethod(moo, receiver, selector, to_super);
if (!method)
{
@ -4884,7 +4896,7 @@ static int send_message (moo_t* moo, moo_oop_char_t selector, moo_ooi_t nargs, i
MOO_LOG4 (moo, MOO_LOG_IC | MOO_LOG_FATAL,
"Fatal error - unable to find a fallback method [%O>>%.*js] for receiver [%O]\n",
MOO_CLASSOF(moo, receiver), MOO_OBJ_GET_SIZE(moo->does_not_understand_sym), MOO_OBJ_GET_CHAR_SLOT(moo->does_not_understand_sym), receiver);
moo_seterrbfmt (moo, MOO_EMSGSND, "unable to find a fallback method - %O>>%.*js",
MOO_CLASSOF(moo, receiver), MOO_OBJ_GET_SIZE(moo->does_not_understand_sym), MOO_OBJ_GET_CHAR_SLOT(moo->does_not_understand_sym));
return -1;
@ -5515,7 +5527,7 @@ static int __execute (moo_t* moo)
bcode = FETCH_BYTE_CODE(moo);
#if defined(MOO_PROFILE_VM)
moo->inst_counter++;
moo->stat.inst_counter++;
#endif
/* ==== DISPATCH TABLE ==== */
@ -6381,7 +6393,6 @@ static int __execute (moo_t* moo)
return 0;
}
int moo_execute (moo_t* moo)
{
int n;
@ -6390,10 +6401,6 @@ int moo_execute (moo_t* moo)
log_default_type_mask = moo->log.default_type_mask;
moo->log.default_type_mask |= MOO_LOG_VM;
#if defined(MOO_PROFILE_VM)
moo->inst_counter = 0;
#endif
if (vm_startup(moo) <= -1) return -1;
moo->proc_switched = 0;
@ -6403,10 +6410,6 @@ int moo_execute (moo_t* moo)
vm_cleanup (moo);
#if defined(MOO_PROFILE_VM)
MOO_LOG1 (moo, MOO_LOG_IC | MOO_LOG_INFO, "TOTAL_INST_COUTNER = %zu\n", moo->inst_counter);
#endif
moo->log.default_type_mask = log_default_type_mask;
return n;
}
@ -6424,6 +6427,13 @@ int moo_invoke (moo_t* moo, const moo_oocs_t* objname, const moo_oocs_t* mthname
MOO_ASSERT (moo, moo->active_context == MOO_NULL);
MOO_ASSERT (moo, moo->active_method == MOO_NULL);
#if defined(MOO_PROFILE_VM)
moo->stat.inst_counter = 0;
moo->stat.method_cache_hits = 0;
moo->stat.method_cache_misses = 0;
moo->stat.message_sends = 0;
#endif
moo_clearmethodcache (moo);
if (start_initial_process_and_context(moo, objname, mthname) <= -1) return -1;
@ -6435,6 +6445,13 @@ int moo_invoke (moo_t* moo, const moo_oocs_t* objname, const moo_oocs_t* mthname
moo->initial_context = MOO_NULL;
moo->active_context = MOO_NULL;
moo->active_method = MOO_NULL;
#if defined(MOO_PROFILE_VM)
MOO_LOG1 (moo, MOO_LOG_IC | MOO_LOG_INFO, "Total message sends: %zu\n", moo->stat.message_sends);
MOO_LOG2 (moo, MOO_LOG_IC | MOO_LOG_INFO, "Method cache - hits: %zu, misses: %zu\n", moo->stat.method_cache_hits, moo->stat.method_cache_misses);
MOO_LOG1 (moo, MOO_LOG_IC | MOO_LOG_INFO, "Total instructions: %zu\n", moo->stat.inst_counter);
#endif
return n;
}

View File

@ -1704,8 +1704,14 @@ struct moo_t
moo_method_cache_item_t method_cache[2][MOO_METHOD_CACHE_SIZE];
moo_uintmax_t inst_counter;
moo_ooi_t last_inst_pointer;
struct
{
moo_oow_t method_cache_hits;
moo_oow_t method_cache_misses;
moo_oow_t message_sends;
moo_uintmax_t inst_counter;
} stat;
#if defined(MOO_INCLUDE_COMPILER)
moo_compiler_t* c;