зеркало из https://github.com/github/ruby.git
Add VM insns counter like debug_counter (#2789)
This commit is contained in:
Родитель
bf04fe086b
Коммит
a994b0aee7
30
vm_exec.c
30
vm_exec.c
|
@ -15,6 +15,36 @@
|
|||
static void vm_analysis_insn(int insn);
|
||||
#endif
|
||||
|
||||
#if USE_INSNS_COUNTER
|
||||
static size_t rb_insns_counter[VM_INSTRUCTION_SIZE];
|
||||
|
||||
static void
|
||||
vm_insns_counter_count_insn(int insn)
|
||||
{
|
||||
rb_insns_counter[insn]++;
|
||||
}
|
||||
|
||||
__attribute__((destructor))
|
||||
static void
|
||||
vm_insns_counter_show_results_at_exit(void)
|
||||
{
|
||||
int insn_end = (ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)
|
||||
? VM_INSTRUCTION_SIZE : VM_INSTRUCTION_SIZE / 2;
|
||||
|
||||
size_t total = 0;
|
||||
for (int insn = 0; insn < insn_end; insn++)
|
||||
total += rb_insns_counter[insn];
|
||||
|
||||
for (int insn = 0; insn < insn_end; insn++) {
|
||||
fprintf(stderr, "[RUBY_INSNS_COUNTER]\t%-32s%'12"PRIuSIZE" (%4.1f%%)\n",
|
||||
insn_name(insn), rb_insns_counter[insn],
|
||||
100.0 * rb_insns_counter[insn] / total);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void vm_insns_counter_count_insn(int insn) {}
|
||||
#endif
|
||||
|
||||
#if VMDEBUG > 0
|
||||
#define DECL_SC_REG(type, r, reg) register type reg_##r
|
||||
|
||||
|
|
|
@ -41,6 +41,10 @@ typedef rb_iseq_t *ISEQ;
|
|||
#define throwdebug if(0)printf
|
||||
/* #define throwdebug printf */
|
||||
|
||||
#ifndef USE_INSNS_COUNTER
|
||||
#define USE_INSNS_COUNTER 0
|
||||
#endif
|
||||
|
||||
/************************************************/
|
||||
#if defined(DISPATCH_XXX)
|
||||
error !
|
||||
|
@ -75,7 +79,8 @@ error !
|
|||
(reg_pc - reg_cfp->iseq->body->iseq_encoded), \
|
||||
(reg_cfp->pc - reg_cfp->iseq->body->iseq_encoded), \
|
||||
RSTRING_PTR(rb_iseq_path(reg_cfp->iseq)), \
|
||||
rb_iseq_line_no(reg_cfp->iseq, reg_pc - reg_cfp->iseq->body->iseq_encoded));
|
||||
rb_iseq_line_no(reg_cfp->iseq, reg_pc - reg_cfp->iseq->body->iseq_encoded)); \
|
||||
if (USE_INSNS_COUNTER) vm_insns_counter_count_insn(BIN(insn));
|
||||
|
||||
#define INSN_DISPATCH_SIG(insn)
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче