зеркало из 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);
|
static void vm_analysis_insn(int insn);
|
||||||
#endif
|
#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
|
#if VMDEBUG > 0
|
||||||
#define DECL_SC_REG(type, r, reg) register type reg_##r
|
#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 if(0)printf
|
||||||
/* #define throwdebug printf */
|
/* #define throwdebug printf */
|
||||||
|
|
||||||
|
#ifndef USE_INSNS_COUNTER
|
||||||
|
#define USE_INSNS_COUNTER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
/************************************************/
|
/************************************************/
|
||||||
#if defined(DISPATCH_XXX)
|
#if defined(DISPATCH_XXX)
|
||||||
error !
|
error !
|
||||||
|
@ -75,7 +79,8 @@ error !
|
||||||
(reg_pc - reg_cfp->iseq->body->iseq_encoded), \
|
(reg_pc - reg_cfp->iseq->body->iseq_encoded), \
|
||||||
(reg_cfp->pc - reg_cfp->iseq->body->iseq_encoded), \
|
(reg_cfp->pc - reg_cfp->iseq->body->iseq_encoded), \
|
||||||
RSTRING_PTR(rb_iseq_path(reg_cfp->iseq)), \
|
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)
|
#define INSN_DISPATCH_SIG(insn)
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче