Plan of set_trace_func

$B!!$5$5$@$G$9!%(B

$B!!:G6a!$(B[ruby-core:45949] (1) $B4XO"$G(B trace_func
$B2s$j$N<BAu$r8+$F$$$k$N(B
$B$G$9$,!$?’!9$H@-G=E
$K$$$1$F$$$J$$5$$,$9$k$N$G!$%a%b$r=q$$$F$*$-$^$9!%(B

*1: [ruby-core:45949] Re: [ruby-trunk - Feature #6649] Add new
set_trace_func events “b-call”, “b-return”

$B%Y%s%A%^!<%/!’(B
max = 10_000_000
require ‘benchmark’
Benchmark.bm{|x|
x.report{
max.times{
a = 1
b = 2
}
}
set_null_profiler
x.report{
max.times{
a = 1
b = 2
}
}
}

C code

rb_define_global_function(“set_null_profiler”, set_null_profiler, 0);

static void
null_func(rb_event_flag_t evflag, VALUE data, VALUE self, ID mid, VALUE
klass)
{

}

static VALUE
set_null_profiler(VALUE self)
{
rb_add_event_hook(null_func, RUBY_EVENT_LINE, 0);
return Qnil;
}

$B7k2L!’(B

   user     system      total        real

4.640000 0.140000 4.780000 ( 4.788095) #0) $B2?$bL5$7(B
10.720000 0.020000 10.740000 ( 10.740693) #1) null trace $B$"$j(B
6.810000 0.000000 6.810000 ( 6.816267) #2) n/trace w/o setjmp
6.260000 0.010000 6.270000 ( 6.265966) #3) w/o exec_event_hooks
5.430000 0.000000 5.430000 ( 5.426709) #4) w/o thread_exec_e…

$B"((BVirtual box $B>e$N$F$-$H!<$JB,Dj$G$9!%(B

$B!!8=:_!$(Btrace $B$,Av$k$H$-!$(B

rb_threadptr_exec_event_hooks()
-> (a) thread_suppress_tracing()
-> (b) thread_exec_event_hooks()
-> © hooks $B$N?t$@$1(B exec_event_hooks() $B$r7+$jJV$7(B

$B$N=g$G<B9T$5$l$^$9!%(B

$B!!(B(a) $B$G$O!$(Btrace $BCf$K(B trace
$B$,Av$i$J$$$h$&$K!$(Bth->tracing $B%U%i%0$r@_Dj(B
$B$7$F$$$^$9!%$=$N$?$a$K!$(BPUSH_TAG()
$B$G<B9T$7$F$$$^$9!JNc30$,H/@8$7$?(B
$B$i!$(Bth->tracing $B%U%i%0$r85$KLa$7$FNc30$r>e$KEAHB!K!%(B

$B!!(B(b) $B$G$O!$$J$s$+$F$-$H!<$K%U%i%0$r%;%C%H$7$F!$I,MW$J(B hook
$B4X?t$rA4It8F(B
$B$S=P$7$F$$$^$9!%$3$l$,(B © $B$G$9!%(B

$B!!Nc$($P!$%W%m%U%!%$%i$G$d$j$=$&$J!V%$%Y%s%H$K1~$8$?%+%&%s%?$rA}8:$9$k!W(B
$B$H$$$&=hM}$r$9$k>l9g$O!$:FF~$j$J$I$O$7$=$&$K$J$$$N$G!$(B(a)
$B$G$N=hM}$OITMW(B
$B$G$9!%$^$?!$(B(b)
$B$N!$$J$s$+$$$m$s$J%U%i%0$N=hM}$b!$B?J,ITMW$G$9!%$G!$$=$N(B
$BJU$rA4It:o$C$F!$$@$$$?$$$3$s$J$U$&$K$J$k$@$m$&$J!$$H7W;;$7$?$N$,(B (4)
$B$K(B
$B$J$j$^$9!%(B(4) $B$N>l9g!$$=$b$=$b(B hook
$B4X?t$r8F$s$G$$$J$$$N$G%U%’%"$8$c$J$$(B
$B$s$G$9$,!$$^$!!$M>7W$J=hM}$r$O$V$$$?$i!$$@$$$?$$$3$s$J$b$s$8$c$J$$$+$J$!(B
$B$H;W$C$F$$$^$9!%2?$b$7$J$$;~(B (0)
$B$h$j$O!$$=$l$J$j$KCY$$$G$9$,!$8=>u$N;~(B
$B4V(B (1) $B$O(B 2
$BG\0J>e;~4V$,$+$+$C$F$$$^$9$N$G!$$=$l$h$j$O%^%7$K$J$k$s$8$c$J(B
$B$$$+$H!%(B

$B!!$^$?!$(Bid $B$d$i(B klass
$B$d$i$r!$$3$N%U%m!<$G;}$A2s$C$F$$$k$s$G$9$,!$<B$O(B
cfp
$B$rEO$7$F$"$2$F!$I,MW$K$J$C$?$i$=$3$+$i7W;;$9$k!$$H$$$&$h$&$K$7$?$[$&(B
$B$,%H!<%?%k$N%3%9%H$ODc$$$s$8$c$J$$$+$J!$$H;W$C$F$$$^$9!%(B

$B!!$H$$$&$o$1$G!$Am9g$7$^$9$H!$(B

(1) $B:FF~$j$7$J$$$h$&$K$9$k=hM}$J$I$r>J$$$?%o%$%k%I$J(B hook
$B$,EPO?$G$-$k$h(B
$B$&$K$9$k(B
(2) id, klass $B$J$I$OEO$5$:!$(Bcfp
$B$rEO$7$F!$$=$3$+$i7W;;$9$k$h$&$K$9$k(B
(3) $B:FF~$j$J$I$r$9$k$h$&$J2aJ]8n$J(B hook $B$rEPO?$G$-$k$h$&$K$9$k(B
$B$3$l$O!$(B(1) $B$N>e$K8_49@-$N$?$a$K:n$k!%(B
$B8_49@-$N$?$a!$0z?t$J$I$b=>MhDL$jEO$5$l$k!%(B

$B$F$J$h$&$K!$$7$7$h$&$H;W$$$^$9!%(B2.0 $B$^$G$K!%(B

$B!!0U<1$N9b$$%W%m%U%!%$%i!&%G%P%C%,$J$I$O(B (1)
$B$r;H$($k$h$&$K$G$-$k$h$&$K(B
$B$7$h$&$H;W$$$^$9!%(B