Fwd: [ruby-cvs:33451] Ruby:r26235 (trunk): * trace.h: new file. wraps tracing mechanisms

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

e$B!!<ALd$J$N$G$9$,!$$3$N%3%_%C%H$N%?!<%2%C%H!JL\E*!$4D6-!K$O2?$G$7$g$&$+!%e(B

e$B!!e(Byugui e$B$5$s$+$ie(B dtrace e$BBP1~$r$9$k!$$H$$$&OC$Oe(B IRC
e$B$J$I$G;G$C$F$*e(B
e$B$j!$e(BChangeLog e$B$K$be(B dtrace
e$B$H$$$&8@MU$,F~$C$F$$$^$9!%$J$N$G!$e(Bdtrace e$B$,BPe(B
e$B1~$7$F$$$k4D6-$@$1$G!$2?$+e(B dtrace
e$B4XO"$N4r$7$$$3$H$,F~$k$N$+$J$H;W$C$F$$e(B
e$B$^$7$?!%e(B

e$B!!$?$@!$%Q%C%A$r8+$F$$$k$H!$e(Btrace.he$B!$e(Bprove.rb
e$B$J$I!$%U%!%$%kL>$O$H$F$b0le(B
e$BHLE*$J$b$N$K8+$($^$9!%e(Bruby.h
e$B$b$J$s$+?'!9JQ$o$C$F$$$k$h$&$G$9!%e(B

e$B!!$3$NJU$NA@$$$r65$($FD:$1$J$$$G$7$g$&$+!%JQ99$r$"$s$^$jFI$a$F$$$J$$$N$Ge(B
e$B$9$,!$$=$b$=$b!$e(BRuby
e$B$N%H%l!<%9$^$o$j$rA4It=q$-49$($A$c$C$?$j$9$k$s$Ge(B
e$B$7$g$&$+!%e(B

e$B!!$A$J$_$K!$e(BSolarise$B!$e(BMacOSX e$B0J30$Ke(B dtrace
e$B$,%5%]!<%H$7$F$$$k4D6-$rCN$i$Je(B
e$B$$$N$G!$$b$7$h$+$C$?$i!$$3$N%Q%C%A$,1F6A$9$k4D6-$b65$($FD:$1$J$$$G$7$g$&$+!%e(B

e$B!!$“$H!$=PMh$l$P%Y%s%A%^!<%/7k2L$,$”$k$H4r$7$$$+$b!Je(Bprove
e$B$r;I$5$J$$>uBVe(B
e$B$G$N!K!%e(B

e$B!!<ALd$@$i$1$G62=L$G$9!%e(B

-------- Original Message --------
Subject: [ruby-cvs:33451] Ruby:r26235 (trunk): * trace.h: new file.
wraps tracing mechanisms.
Date: Mon, 4 Jan 2010 00:36:21 +0900 (JST)
From: [email protected]
Reply-To: [email protected]
To: [email protected]

yugui 2010-01-04 00:36:17 +0900 (Mon, 04 Jan 2010)

New Revision: 26235

http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26235

Log:
* trace.h: new file. wraps tracing mechanisms.

* defs/dtrace.d: new file. defined a dtrace provider "ruby".

* include/ruby/ruby.h (LIKELY): moved from vm.c.
  (UNLIKELY): ditto.
  (OBJSETUP): probe "object-create".
  (RUBY_EVENT_RESCUE): new event.

* vm_exec.c (DEBUG_ENTER_INSN): embeded a probe insn-entry into it.
  (DEBUG_END_INSN): insn-return.

* vm.c (LIKELY): moved into ruby.h.
  (UNLIKELY): ditto.
  (Init_BareVM): embeded a probe "raise" into it.

* variable.c (rb_class2name_without_alloc): new utility function.

* tool/rbinstall.rb (install?(:ext, :arch, :'ext-arch')): installs
  dtrace.d if necessary.

* thread_pthread.c (add_signal_thread_list): probe "raise".
  (rb_thread_create_timer_thread): ditto.

* thread.c (rb_thread_schedule_rec): probes "thread-enter" and
  "thread-leave",
  (thread_start_func_2): ditto.
  (thread_cleanup_func): probe "thread-term"

* lib/mkmf.rb: supports dtrace postprocessor on making an extension.

* iseq.c (rb_vm_insn_name): new utility function.
  (rb_vm_insn_len): ditto.

* insns.def (hook): probes "method-etnry", "method-return", "line",
  and "rescue".

* compile.c (iseq_compile_each): adds a trace op for "rescue" probe.

* gc.c (garbage_collect): probes "gc-begin" and "gc-end".
  (obj_free): probe "object-free"
  (garbage_collect_with_gvl): probe "raise"
  (negative_size_allocation_error): ditto.
  (rb_memerror): ditto.

* eval.c (rb_rescue2): probe "rescue"
  (rb_longjmp): probe "raise"

* ext/probe/probe.c: new extension for application defined probes.

* ext/probe/extconf.rb: ditto.

* configure.in (--with-tracing-model): new option to choose a 

tracing
mechanism.
(DTRACE): new substitution. name of dtrace(1).
(RUBY_TRACING_MODEL): new substitution.
(DTRACE_OBJ): ditto.
(MINIDTRACE_OBJ): ditto.
(GOLFDTRACE_OBJ): ditto.
(LIBRUBY_DTRACE_OBJ): ditto.
(RUBY_DTRACE_POSTPROCESS): new macro. checks whether the dtrace on
the system needs postprocessing.
(RUBY_DTRACE_BSD_BROKEN): new macro. checks whether the dtrace
supports USDT.

* Makefile.in:
  (DTRACE): new variable. name of dtrace(1).
  (TRACING_MODEL): new variable. name of the chosen tracing 

mechanism.
(DTRACE_OBJ): same as the one in configure.in.
(MINIDTRACE_OBJ): ditto.
(GOLFDTRACE_OBJ): ditto.
(LIBRUBY_DTRACE_OBJ): ditto.
(CPPOUTFILE): new substitution. necessary for generating dtrace.d
(trace_none.h): new target for TRACING_MODEL=none
(RUBY_H_INCLUDES): appended a header for tracing.
(distclean-local): also removes preprocessed version of dtrace.d
($(LIBRUBY_A)): needs $(LIBRUBY_DTRACE_OBJ) if dtrace needs
postprocessing.
($(PROGRAM)): ditto.
(golf): ditto.
(miniruby): ditto.
($(arch_hdrdir)/ruby/dtrace.d): new target. preprocessed verson
of defs/dtrace.d. generated if necessary.
($(arch_hdrdir)/ruby/trace_dtrace.h): new target.
definition of probes.
($(LIBRUBY_DTRACE_OBJ)): new target. generated if dtrace needs
postprocessing.
($(DTRACE_OBJ)): ditto.
($(MINIDTRACE_OBJ)): ditto.
($(GOLFDTRACE_OBJ)): ditto.

Added directories:
trunk/ext/probe/
Added files:
trunk/defs/dtrace.d
trunk/ext/probe/extconf.rb
trunk/ext/probe/probe.c
trunk/include/ruby/trace.h
Modified files:
trunk/ChangeLog
trunk/Makefile.in
trunk/NEWS
trunk/common.mk
trunk/compile.c
trunk/configure.in
trunk/eval.c
trunk/gc.c
trunk/include/ruby/ruby.h
trunk/insns.def
trunk/iseq.c
trunk/lib/mkmf.rb
trunk/thread.c
trunk/thread_pthread.c
trunk/tool/rbinstall.rb
trunk/variable.c
trunk/vm.c
trunk/vm_core.h
trunk/vm_exec.h

(2010/01/04 13:53), SASADA Koichi wrote::

e$B!!$?$@!$%Q%C%A$r8+$F$$$k$H!$e(Btrace.he$B!$e(Bprove.rb e$B$J$I!$%U%!%$%kL>$O$H$F$b0le(B
e$BHLE*$J$b$N$K8+$($^$9!%e(Bruby.h e$B$b$J$s$+?’!9JQ$o$C$F$$$k$h$&$G$9!%e(B

e$B!!D{@5$G$9!%e(Bprove.rb e$B$8$c$J$/$Fe(B trunk/ext/probe/probe.c
e$B$G$7$?!%$=$b$=$be(B
v e$B$C$F!%e(B

(2010/01/04 13:53), SASADA Koichi wrote::

e$B!!$?$@!$%Q%C%A$r8+$F$$$k$H!$e(Btrace.he$B!$e(Bprove.rb e$B$J$I!$%U%!%$%kL>$O$H$F$b0le(B
e$BHLE*$J$b$N$K8+$($^$9!%e(Bruby.h e$B$b$J$s$+?’!9JQ$o$C$F$$$k$h$&$G$9!%e(B

e$B!!D{@5$G$9!%e(Bprove.rb e$B$8$c$J$/$Fe(B trunk/ext/probe/probe.c e$B$G$7$?!%$=$b$=$be(B
v e$B$C$F!%e(B

e$B%3!<%I$,@5$7$$$3$H$r>ZL@$7$F$/$l$kKbK!$N%H%l!<%5!<e(B :slight_smile:

e$B$3$s$K$A$O!"$J$+$`$ie(B(e$B$&e(B)e$B$G$9!#e(B

In message “[ruby-dev:39957] Re: Fwd: [ruby-cvs:33451] Ruby:r26235
(trunk): * trace.h: new file. wraps tracing mechanisms.”
on Jan.04,2010 17:09:26, [email protected] wrote:

e$B$3$NB>$K!“e(BRubye$B%”%W%j%1!<%7%g%s$NA4BNE*$J5sF0$r30It$+$iCN$C$FE}7WE*$K=hM}$9$k!“e(B(1)e$B$h$j$b9b?e=`$J%K!<%:$b$”$m$&$+$H$O;W$$$^$9!#e(B
e$B$3$l$r$$$/$i$+%5%]!<%H$9$k$N$,e(Bprobee$B%i%$%V%i%j$G!“e(BMacRubye$B$de(BApplee$B$Ne(Bruby(1)e$B$G$OAH$9~$%i%$%V%i%je(Bdtracee$B$K$J$C$F$^$9$,!”$=$l$Oe(B
e$B$d$j2a$.$HH=CG$7$FE:IU%i%$%V%i%j$K0$7$^$7$?!#$^$?!“e(Bdtracee$B$rMxMQ$7$F$=$N%K!<%:$rK~$?$9$?$a$Ke(Bruby-dtrace geme$B$,$”$k$h$&$G$9!#e(B

probee$B3HD%%i%$%V%i%j$G$9$,!“e(Brdoce$B$b$J$$$7!“DI2C$9$k$N%0%m!<%P%ke(B
e$B4X?t$@$7!”$=$N4X?t$NL>A0$b$J$s$@$+$J!<$H;W$&$7e(B(e$B$3$l$O<g4Q$G$9e(B
e$B$,e(B)e$B!”$A$g$C$H%b%N$,9S$$$s$8$c$J$$$+$H;W$$$^$9!#e(B

e$B$=$b$=$be(Bprobee$B$J$Ne(B?
e$B$H$+!“e(Bfiree$B$C$F$N$O$3$&$$$&MQES$G>o<1E*$JL>e(B
e$BA0$J$Ne(B? e$B$H$+$$$&5?Ld$b$”$k$s$G$9$,!“MQ8l$N@'Hs$O$H$j$”$($:CVe(B
e$B$$$F$*$/$H$7$F!"$;$a$F%b%8%e!<%k$H$=$N%b%8%e!<%k4X?t$K$9$k$He(B
e$B$+$I$&$G$7$g$&$+!#e(B

ext/coveragee$B$O9%Nce(B

e$B$=$l$G$O!#e(B

2010/1/4 SASADA Koichi [email protected]:

ただ,パッチを見ていると,trace.h,prove.rb など,ファイル名はとても一
般的なものに見えます.ruby.h もなんか色々変わっているようです.

OSX付属のruby(1)およびMacRubyのdtraceサポートを参考に、Rubyの各所に対して
アプリケーションを実行時にトレースするための観測点を埋め込みました。
観測点は結局set_trace_funcのものと重なる物も多く、そういったものはVMのtrace命令
の実装の中に埋め込んであります。その他は観測点は全体に散らばっています。

ruby.hの変更は2点です。オブジェクトの生成というのは是非トレースしたいタイミングですが、
生成されるオブジェクトのVALUE値およびクラスを確実に知ることのできるタイミングはOBJSETUPしかありません。
そこでOBJSETUPã«è¦³æ¸¬ç‚¹ã‚’è¿½åŠ ã—ã¾ã—ãŸã€‚

æ¬¡ã«ã€æ®†ã©ã®å ´åˆã¯è¦³æ¸¬ç‚¹ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ãªã„ã¨è€ƒãˆã‚‰ã‚Œã‚‹ã®ã§ã€ã“ã®ã“ã¨ã‚’ã‚³ãƒ³ãƒ‘ã‚¤ãƒ©ã«çŸ¥ã‚‰ã›ã‚‹ãŸã‚ã«
従来VMで使用していたLIKELYとUNLIKELYのようなものが必要でした。OBJSETUPã®å¿…è¦ãªå ´æ‰€ã§ã¯UNLIKELY
が必要になる可能性があるわけですから、ruby.hに書くのが適切です。そこでVMからruby.hに両マクロの定義を移動させました。

なお、これらの変更はバイナリ互換性および拡張ライブラリソースの互換性を損ねません。

ã“ã®è¾ºã®ç‹™ã„ã‚’æ•™ãˆã¦é ‚ã‘ãªã„ã§ã—ã‚‡ã†ã‹ï¼Žå¤‰æ›´ã‚’ã‚ã‚“ã¾ã‚Šèª­ã‚ã¦ã„ãªã„ã®ã§
すが,そもそも,Ruby のトレースまわりを全部書き換えちゃったりするんで
しょうか.

狙いは、Rubyアプリケーションの実行時に、アプリケーションを改変することなく外部から状態を計測することです。
今回、まずは非有効時のオーバーヘッドが少ない技術としてdtraceの上に実装してみましたが、
dtraceべったりではないので他のメカニズムも実装すれば、configure時に選択可能です。
usaさんからwindowsだとETWもありえるという指摘をいただきました。
traceやprobeのような一般的な名前はdtraceべったりでなくした結果です。

set_trace_funcのようなRuby内部から自分自身の実行をトレースする機能とは少し指向が違うと思われます。
結果としてtrace命令で同居した部分はありますが、結局は別途の実装が必要です。むしろ
現在VMやGCのそれぞれのモジュール内で独自に#ifdef で切り分けているデバッグ出力のほうが近いかも知れませんが、
今回これらを統合するには至りませんでした。

つまり、今rubyには3種類のトレースがあります。
(1) Rubyプログラムの挙動をRubyプログラム内から知るためのもの - set_trace_func
(2) Rubyアプリケーションを稼働させているRuby処理系の状況を外部から知るためのもの - 今回入れたもの
(3) Ruby処理系の特定のモジュールの詳しい状況を外部から知るためのもの - #ifdefで書かれている従来のもの。通常無効

この他に、Rubyアプリケーションの全体的な挙動を外部から知って統計的に処理する、(1)よりも高水準なニーズもあろうかとは思います。
これをいくらかサポートするのがprobeライブラリで、MacRubyやAppleのruby(1)では組み込みライブラリdtraceになってますが、それは
やり過ぎと判断して添付ライブラリに移しました。また、dtraceを利用してそのニーズを満たすためにruby-dtrace gemがあるようです。

ちなみに,Solaris,MacOSX 以外に dtrace がサポートしている環境を知らな
ã„ã®ã§ï¼Œã‚‚ã—ã‚ˆã‹ã£ãŸã‚‰ï¼Œã“ã®ãƒ‘ãƒƒãƒãŒå½±éŸ¿ã™ã‚‹ç’°å¢ƒã‚‚æ•™ãˆã¦é ‚ã‘ãªã„ã§ã—ã‚‡ã†ã‹ï¼Ž

FreeBSDがdtraceサポートをしていると聞いていましたが、ここで使っているdtraceのUSDTは
うまく動作しないように見えました。そのため、現在はFreeBSDでは有効になりません。

その他の環境では./configure時にトレースが無効化されるので影響しません。

あと,出来ればベンチマーク結果があると嬉しいかも(prove を刺さない状態
での).

あー、計ってからコミットしようと思っていて忘れてました。やってみました。添付します。 (wo_w-dtrace.log)
リビジョン番号が新しいほうがdtraceを入れたやつです。

なお、意外にオーバーヘッドが大きいように見えました。特に命令をひたすら繰り返す系統が遅いので、試しにYARV命令ごとのトレースを削除して再度計ってみました。
そちらがwo_w-dtrace2.logになります。他のトレースメカニズムを取り入れると、もっとオーバーヘッドが大きいことも考えられますし、
命令ごとのトレースはデフォルトで無効にしたほうが良いかも知れませんね。

e$B1sF#$G$9!#e(B

API
e$B%l%Y%k$G8+$($kDI2C$N$"$k!"0l8+$9$k$H$G$+$$%3%%C%H$,$$$-$J$jF~$C$?e(B
e$B$N$G!"$S$C$/$j$7$^$7$?!#0l1~e(B ML e$B$G$NM=9p$,M
$7$$$G$9!#e(B

e$B$=$l$O$H$b$+$/!"$6$C$H%3!<%I%l%S%e!<$N??;w;v$r$7$F$_$^$7$?!#e(B

e$B!{e(B LIKELY / UNLIKELY e$B$NL>A0$,$^$:$$e(B (e$B=EBge(B)

RB_LIKELY
e$B$J$I!“B>$N%i%$%V%i%j$H>WFM$7$J$5$=$&$JL>A0$K$9$kI,MW$,$”$j$^$9!#e(B

e$B$^$?!"e(Bruby.h e$B$K=q$+$l$k$H$$$&$3$H$O!"e(BLIKELY / UNLIKELY
e$B$O8x3+e(B API e$B$J$Ne(B
e$B$G$7$g$&$+e(B (e$B8D?ME*$K$O!"e(Bruby.h
e$B$K=q$+$l$F$$$k$@$1$G$O8x3+e(B API e$B$G$O$J$$$He(B
e$B;W$C$F$$$^$9$,!“e(BYugui e$B$5$s$N9M$($G$O$=$&$G$O$J$5$=$&$J$N$Ge(B)
e$B!#e(B
e$B$H$j$”$($:e(B /** @internal */ e$B$H$+$D$1$k$H$I$&$G$7$g$&!#e(B

e$B!{e(B RUBY_EVENT_RESCUE e$B$,DI2C$5$l$?e(B (e$B$d$d=EBge(B)

e$B$3$l$Oe(B dtrace e$B$K4X78$J$/e(B set_trace_func e$B$G$b8+$($ke(B API
e$B%l%Y%k$NJQ99$G$9!#e(B

$ ./ruby -e ’
set_trace_func(proc {|name, | p name })
begin
raise
rescue
end

“c-return”
“line”
snip
“c-return”
“unknown” # <== e$B$3$N9T!*!*e(B

3 e$BE@$"$j$^$9!#e(B

  • API e$B%l%Y%k$N;EMMJQ99$@$1$Ie(B OK e$B!)e(B
    e$B:#2s$N%3%_%C%H$H$OJL$K5DO@$9$Y$-e(B
    e$B$G$O$J$$$+e(B
  • unknown e$B$H$$$&L>A0$OD>$9$Y$-e(B
  • e$B$3$l$GF@$i$l$ke(B binding e$B$O;H$C$F$bBg>fIW!)e(B (SEGV
    e$B$H$+$7$J$$!)e(B)

e$B!{e(B UNLIKELY e$B$,;H$o$l$F$$$k$H$3$m$H;H$o$l$F$$$J$$$H$3$m$,$"$ke(B

gc.c e$B$NCf$Ke(B

if (UNLIKELY(TRACE_RAISE_ENABLED())) FIRE_RAISE_FATAL();

e$B$H$$$&2U=j$H!"e(B

if (TRACE_OBJECT_FREE_ENABLED()) FIRE_OBJECT_FREE(rb_obj_id(obj));

e$B$H$$$&2U=j$,$"$j$^$9!#$3$N0c$$$O0U?^E*$G$7$g$&$+!#$=$l$H$bC1$J$kIU$1e(B
e$BK:$l!)e(B e$BB>$K$b$$$/$D$+e(B UNLIKELY e$B$,$D$$$F$$$J$$e(B probe
e$B$,$"$j$^$7$?!#e(B

e$B!{e(B rb_class2name_without_alloc e$B$O$J$<I,MW$+e(B

variable.c e$B$Ke(B rb_class2name_without_alloc
e$B$H$$$&4X?t$,DI2C$5$l$F$$$^$9e(B
e$B$,!“e(Bgrep
e$B$7$?$@$1$G$O$I$3$G;H$o$l$F$$$k$N$+$o$+$j$^$;$s$G$7$?!#e(B
e$B$3$l$O:#2s$NJQ99$G0l=o$KDI2C$9$kI,MW$,$”$C$?$N$G$7$g$&$+!#e(B

e$B!{e(B thread_pthread.c e$B$Ke(B probe e$B$rF~$l$k$N$Oe(B OK e$B!)e(B

thread_pthread.c e$B$K$$$m$$$mF~$l$k$N$O$d$d5$;}$A0-$$$G$9!#e(B
e$B$5$5$@$5$s$,e(B OK e$B$H8@$($Pe(B OK e$B$@$H;W$$$^$9$,!#e(B

e$B0[>o=*N;$Ne(B exit e$B$ND>A0$Ke(B FIRE_RAISE_FATAL()
e$B$rF~$l$?$+$C$?$@$1$N$h$&$Ke(B
e$B8+$($^$9$,!";w$?J8L.$Ge(B exit e$B$rFI$s$G$$$k2U=j$Oe(B regcomp.c
e$B$J$I$K$b$A$i$[$ie(B
e$B$"$k$h$&$G$9!#e(B
ruby_fatal_exit e$B$H$+:n$C$F!"=>Mh0[>o=*N;$NJ8L.$Ge(B exit
e$B$rFI$s$G$$$k2U=je(B
e$B$G$OA4Ite(B ruby_fatal_exit e$B$r8F$V$h$&$K$7$?$i$I$&$G$7$g$&!#e(B

e$B!{e(B probe e$B3HD%%i%$%V%i%j$,9S:o$je(B

usa e$B$5$s$NFM$C9~$_$KF10U$G$9!#e(B [ruby-dev:39958]

e$B$=$l$K$7$F$b!“e(Bgcc e$B$Ke(B AOP
e$B$,$”$l$P$J$"$H;W$&$h$&$JJQ99$G$9$M!#e(B

e$B$K!$@lMQ$]$/$9$k!Ke(B (b) gem e$B$GI8=$C$]$$$b$N$r:n$C$F;n9T:x8m$7!$I8=E:IUe(B
e$B$rA@$&!$$J$s$FJ}?K$b$"$k$s$8$c$J$$$+$H;W$$$^$9!%e(B

e$B!!$"$H!$e(Bset_trace_func e$B$N5sF0$,e(B rescue e$B$b$R$C$+$1$k$h$&$K$J$C$F$7$^$C$Fe(B
e$BJQ$o$C$F$7$^$C$?$H$$$&$3$H$re(B IRC e$B$GJ9$-$^$7$?!%$3$NJU$N5sF0$NJQ99$O!$:#e(B
e$B2s$NOC$H$OD>@\4X78$J$5$=$&$G$9$+$i!$JLES5DO@$7$?$[$&$,$$$$$N$G$O$J$$$Ge(B
e$B$7$g$&$+!%B?J,!$A}$($F:$$k?M$O$"$^$j5o$J$$$H;W$$$^$9$,!%e(B

[e$B$$$D$bC&@~OC$7$+$7$J$$;d$,$3$3$G$9$+$5$:;(CL$r$Pe(B]

Linuxe$B4X78$Ge(Btracee$B$^$o$j$r$4$K$g$4$K$g$7$?7P83$G$$$&$H!"e(B(1)e$B$OD6??7u$K5DO@$7$Fe(B
e$B$+$i%^!<%8$7$?$[$&$,$h$$$H;W$$$^$9!#e(Bprobee$B$C$Fe(BAPIe$B$K$J$C$F$7$^$&$N$G!"0lEYe(B
probee$B$rF~$l$F$7$^$&$H$=$N%k!<%H$,40A4$K>C$($F$7$^$&$h$&$JBg5,LO%j%U%!%/%?%j%s%0$,e(B
e$B=PMh$J$/$J$k$N$G!#e(B

e$B$J$N$G!"e(BLinuxe$B$G$O%H%l!<%9%G!<%?$N;H$$J}$r@bL@$5$;$F!V$$$D$+;H$&$+$b!W7O$Oe(B
e$B5Q2<$9$k%k!<%k$K$7$F$$$^$7$?!#$J$N$Ge(Bprobee$BF~$l$?$$?M$Oe(BPhythone$B%9%/%j%W%H$rJY6/$7$Fe(B
e$B0l@87|L?@-G=%G!<%?$Ne(BPlote$B%9%/%j%W%H$r3+H/$9$k1)L$K$J$k$H$$$&!&!&!&e(B

2010/1/4 Yusuke ENDOH [email protected]:

e$B!{e(B LIKELY / UNLIKELY e$B$NL>A0$,$^$:$$e(B (e$B=EBge(B)

RB_LIKELY e$B$J$I!“B>$N%i%$%V%i%j$H>WFM$7$J$5$=$&$JL>A0$K$9$kI,MW$,$”$j$^$9!#e(B

e$B$^$?!"e(Bruby.h e$B$K=q$+$l$k$H$$$&$3$H$O!"e(BLIKELY / UNLIKELY e$B$O8x3+e(B API e$B$J$Ne(B
e$B$G$7$g$&$+e(B (e$B8D?ME*$K$O!"e(Bruby.h e$B$K=q$+$l$F$$$k$@$1$G$O8x3+e(B API e$B$G$O$J$$$He(B
e$B;W$C$F$$$^$9$,!“e(BYugui e$B$5$s$N9M$($G$O$=$&$G$O$J$5$=$&$J$N$Ge(B) e$B!#e(B
e$B$H$j$”$($:e(B /** @internal */ e$B$H$+$D$1$k$H$I$&$G$7$g$&!#e(B

e$BL>A0$NJQ99$b!“e(Binternale$B$G$”$k$3$H$bF10U$7$^$9!#e(B
e$BJL$Ke(Bruby.he$B$KHs8x3+$N$b$N$,F~$C$F$k$N$O9=$o$J$$$s$G$9$,!“$=$l$J$i$=$&$HL@5-$7$FLc$o$J$$$H30It$GCN$i$:$K;H$C$F$7$^$&$3$H$rKI$2$J$$$N$Ge(B
e$B=q$/$Y$-$@$H$$$&$N$,;d$N<gD%$G$9!#$=$l$K4p$E$/$H!”:#2s$N$=$l$O=q$/$Y$-$G$9$M!#e(B

e$B!{e(B RUBY_EVENT_RESCUE e$B$,DI2C$5$l$?e(B (e$B$d$d=EBge(B)

e$B$3$l$Oe(B dtrace e$B$K4X78$J$/e(B set_trace_func e$B$G$b8+$($ke(B API e$B%l%Y%k$NJQ99$G$9!#e(B

e$B$“!<!“3N$+$K!#1#$7$?$[$&$,NI$$$N$+!”$=$l$H$be(BRubye$B%l%Y%k$+$i$bMQES$O$”$k$N$+!#e(B

  • e$B$3$l$GF@$i$l$ke(B binding e$B$O;H$C$F$bBg>fIW!)e(B (SEGV e$B$H$+$7$J$$!)e(B)

e$B1#$7$?J}$,$h$$$N$+$bCN$l$^$;$s!#e(B

e$B!{e(B UNLIKELY e$B$,;H$o$l$F$$$k$H$3$m$H;H$o$l$F$$$J$$$H$3$m$,$"$ke(B

e$B$=$l$OIU$1K:$l$G$9!#e(B

e$B!{e(B rb_class2name_without_alloc e$B$O$J$<I,MW$+e(B

variable.c e$B$Ke(B rb_class2name_without_alloc e$B$H$$$&4X?t$,DI2C$5$l$F$$$^$9e(B
e$B$,!“e(Bgrep e$B$7$?$@$1$G$O$I$3$G;H$o$l$F$$$k$N$+$o$+$j$^$;$s$G$7$?!#e(B
e$B$3$l$O:#2s$NJQ99$G0l=o$KDI2C$9$kI,MW$,$”$C$?$N$G$7$g$&$+!#e(B

e$B$se(B!e$B!!e(Bmacrubye$B$HF1$8$h$&$Ke(Bobject-freee$B$G%/%i%9L>$rEO$9$[$&$,$h$+$m$&$H;W$C$F!";H$$K:$l$F$*$j$^$7$?!#e(B

e$B!{e(B thread_pthread.c e$B$Ke(B probe e$B$rF~$l$k$N$Oe(B OK e$B!)e(B

e$BJL$K$5$7$F$*$+$7$/$O$J$$$H;W$$$^$9$,!"e(B

ruby_fatal_exit e$B$H$+:n$C$F!"=>Mh0[>o=*N;$NJ8L.$Ge(B exit e$B$rFI$s$G$$$k2U=je(B
e$B$G$OA4Ite(B ruby_fatal_exit e$B$r8F$V$h$&$K$7$?$i$I$&$G$7$g$&!#e(B

e$B$3$N$[$&$,$h$jNI$$$G$9$M!#$=$&$7$^$7$g$&!#e(B

e$B!{e(B probe e$B3HD%%i%$%V%i%j$,9S:o$je(B

usa e$B$5$s$NFM$C9~$_$KF10U$G$9!#e(B [ruby-dev:39958]

e$B;d$bF10U$7$^$9!#$=$&$7$^$7$g$&!#e(B

2010/1/4 SASADA Koichi [email protected]:

e$B!!e(Btrace e$BL?Na$rI,MW$J$H$-$KKd$a9~$$h$&$K$9$k!$$H$$$&OC$b$"$C$?$j$J$+$C$?e(B e$B$j$7$^$9$,!$$=$NJU$H%P%C%F%#%s%0$7$J$$$@$m$&$+!%Kd$a9~$e(B API e$B$,L@3N2=$5e(B
e$B$l$l$P$$$$$+!%e(B

e$B$=$&$G$9$M!#%P%C%F%#%s%0$7$?$i$=$N$H$-$K=$@5$7$^$7$g$&!#e(B

e$BA@$$$O!“e(BRubye$B%”%W%j%1!<%7%g%s$N<B9T;~$K!“%”%W%j%1!<%7%g%s$r2~JQ$9$k$3$H$J$/30It$+$i>uBV$r7WB,$9$k$3$H$G$9!#e(B

e$B!!!Ve(BDTrace e$B$r;}$D4D6-2<$G$O!W$G!$0lHLE*$JOC$8$c$J$$$G$9$h$M!%$3$l$+$ie(B
DTrace e$B$,0lHLE*$K$J$C$F$$$/$N$+$b$7$l$^$;$s$,!$8=:_$O$=$&$8$c$J$$$o$1$G!%e(B

dtracee$B$NN4@9$r8+$F!“e(BRubye$B%”%W%j%1!<%7%g%s$N1?MQ$G!V3N$+$K;H$($?$iJXMx$@$J!W$H46$8$?$N$,H/C<$G$“$k$N$O3N$+$G$9!#e(B
e$B$7$+$7!”$=$3$K0MB8$5$;$k$D$b$j$O$“$j$^$;$s!#<B:]e(BETWe$B$H$$$&0F$b$”$k$o$1$G!“$8$c$”=q$3$&$+$H;W$C$F$$$?Lp@h$G$9!#e(B

e$B!!$^$:!$I8=`$Ne(B probe e$B%i%$%V%i%j$H$9$k$?$a$K$O!$e(B

(1) probe e$B$NA^F~E@$NBEEv@-$N8!>Ze(B
(2) probe e$B$NA^F~E@$NL>A0$N8!>Ze(B
(3) e$B<BAuJ}K!$N8!>Ze(B

e$B$,I,MW$+$H;W$$$^$9!%e(B(1)e$B!Ae(B(3) e$B$^$G!$$I$l$b$^$@$H$$$&G’<1$G$$$$$G$7$g$&$+!%e(B

e$B%3%_%C%H$5$l$J$$$H8!>Z$b$^$^$J$i$J$$!$$H$$$&0U8+$,$"$k$+$H;W$$$^$9!%e(B

e$B$=$&$G$9$M!#$I$l$b$^$@$G$9!#3+H/2q5D$K$F!“!VC/$+$,<BAu$7$F$b$N$r8+$;$F$/$l$J$$$H8!>Z$b?J$^$J$$!W$H$$$&e(B
e$B;XE&$rLc$$$^$7$?$N$G!”<BAu$7$F$_$^$7$?!#e(B

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

e$B!!@bL@!$$"$j$,$H$&$4$6$$$^$9!%e(B

(2010/01/04 17:09), Yugui wrote::

OSXe$BIUB0$Ne(Bruby(1)e$B$$h$Se(BMacRubye$B$Ne(Bdtracee$B%5%]!<%H$r;29M$K!“e(BRubye$B$N3F=j$KBP$7$Fe(B
e$B%”%W%j%1!<%7%g%s$r<B9T;~$K%H%l!<%9$9$k$?$a$N4QB,E@$rKd$a9~$_$^$7$?!#e(B
e$B4QB,E@$O7k6Ie(Bset_trace_funce$B$N$b$N$H=E$J$kJ
$bB?$/!"$=$&$$$C$?$b$N$Oe(BVMe$B$Ne(Btracee$BL?Nae(B
e$B$N<BAu$NCf$KKd$a9~$s$G$"$j$^$9!#$=$NB>$O4QB,E@$OA4BN$K;6$i$P$C$F$$$^$9!#e(B

e$B!!e(Btrace
e$BL?Na$rI,MW$J$H$-$KKd$a9~$$h$&$K$9$k!$$H$$$&OC$b$"$C$?$j$J$+$C$?e(B e$B$j$7$^$9$,!$$=$NJU$H%P%C%F%#%s%0$7$J$$$@$m$&$+!%Kd$a9~$e(B API
e$B$,L@3N2=$5e(B
e$B$l$l$P$$$$$+!%e(B

ruby.he$B$NJQ99$Oe(B2e$BE@$G$9!#%%V%8%’%/%H$N@8@.$H$$$&$N$O@'Hs%H%l!<%9$7$?$$%?%$%_%s%0$G$9$,!"e(B
e$B@8@.$5$l$k%
%V%8%’%/%H$Ne(BVALUEe$BCM$*$h$S%/%i%9$r3N<B$KCN$k$3$H$N$G$-$k%?%$%_%s%0$Oe(BOBJSETUPe$B$7$+$"$j$^$;$s!#e(B
e$B$=$3$Ge(BOBJSETUPe$B$K4QB,E@$rDI2C$7$^$7$?!#e(B

e$B!!2f!9$,8&5f$G:n$C$F$$$k%W%m%U%!%$%i$G$O!$e(BOBJSETUP
e$B$G$N%?%$%_%s%0$G$OI,e(B
e$BMW$J>pJs$,<h$l$J$$!$$H$$$&$3$H$G!$<!A1:v$r$H$k$3$H$K$7$^$7$?!%$3$l$O!$:#e(B
e$B:n6HCf$J$N$G>:Y$ON,!%e(B

e$B!!$G$b!$$d$j$?$$$3$H$O$3$l$GA4It=PMh$k$N$+$J$!!%e(B

e$B<!$K!“KX$I$N>l9g$O4QB,E@$OM-8z2=$5$l$F$$$J$$$H9M$($i$l$k$N$G!”$3$N$3$H$r%3%s%Q%$%i$KCN$i$;$k$?$a$Ke(B
e$B=>Mhe(BVMe$B$G;HMQ$7$F$$$?e(BLIKELYe$B$He(BUNLIKELYe$B$N$h$&$J$b$N$,I,MW$G$7$?!#e(BOBJSETUPe$B$NI,MW$J>l=j$G$Oe(BUNLIKELY
e$B$,I,MW$K$J$k2DG=@-$,$"$k$o$1$G$9$+$i!"e(Bruby.he$B$K=q$/$N$,E,@Z$G$9!#$=$3$Ge(BVMe$B$+$ie(Bruby.he$B$KN>%^%/%m$NDj5A$r0\F0$5$;$^$7$?!#e(B

e$B!!e(BLIKELYe$B!$e(BUNLIKELY e$B$O$?$7$+e(B Linux
e$B$N%=!<%9$+$i<h$C$?$h$&$J5$$,$9$k$s$G$9e(B
e$B$,!Je(BBinary Hacks
e$B$GFI$s$@$s$@$C$1!K!$==J,$K0lHLE*$JL>A0$J$s$G$7$g$&$+!%e(B
e$B;d$,$3$l$rF3F~$7$?$H$-$O!$e(BVM
e$B$NCf$@$1$@$+$i!$$^$!$$$C$+$!!$$H$"$^$j9M$(e(B
e$B$:$K;H$$$^$7$?!%e(B

e$B!!$3$l$r!$A4e(B
Ce$B3HD%%i%$%V%i%j3+H/<T$,;H$($k$h$&$K$9$k$?$a$K$O!$$b$&>/$75De(B
e$BO@$,I,MW$J5$$b$7$^$9!%$,!$[9M+$G$7$g$&$+!%8D?ME*$K$O!$$b$&>/$7$o$+$j$d$9e(B
e$B$$L>A0$,$$$$$H;W$&$N$G$9$,!%Nc$($P!$J,$+$i$J$$?M$,$F$-$H!<$K=q$$$A$c$&ITe(B
e$B0B$O$J$$$G$7$g$&$+!%e(B

e$B$3$NJU$NA@$$$r65$($FD:$1$J$$$G$7$g$&$+!%JQ99$r$"$s$^$jFI$a$F$$$J$$$N$Ge(B
e$B$9$,!$$=$b$=$b!$e(BRuby e$B$N%H%l!<%9$^$o$j$rA4It=q$-49$($A$c$C$?$j$9$k$s$Ge(B
e$B$7$g$&$+!%e(B

e$BA@$$$O!“e(BRubye$B%”%W%j%1!<%7%g%s$N<B9T;~$K!"%"%W%j%1!<%7%g%s$r2~JQ$9$k$3$H$J$/30It$+$i>uBV$r7WB,$9$k$3$H$G$9!#e(B

e$B!!!Ve(BDTrace
e$B$r;}$D4D6-2<$G$O!W$G!$0lHLE*$JOC$8$c$J$$$G$9$h$M!%$3$l$+$ie(B
DTrace
e$B$,0lHLE*$K$J$C$F$$$/$N$+$b$7$l$^$;$s$,!$8=:_$O$=$&$8$c$J$$$o$1$G!%e(B

e$B:#2s!"$^$:$OHsM-8z;~$N%!<%P!<%X%C%I$,>/$J$$5;=Q$H$7$Fe(Bdtracee$B$N>e$K<BAu$7$F$_$^$7$?$,!"e(B
dtracee$B$Y$C$?$j$G$O$J$$$N$GB>$N%a%+%K%:%`$b<BAu$9$l$P!"e(Bconfiguree$B;~$KA
Br2DG=$G$9!#e(B
usae$B$5$s$+$ie(Bwindowse$B$@$He(BETWe$B$b$"$j$($k$H$$$&;XE&$r$$$?$@$-$^$7$?!#e(B
tracee$B$de(Bprobee$B$N$h$&$J0lHLE*$JL>A0$Oe(Bdtracee$B$Y$C$?$j$G$J$/$7$?7k2L$G$9!#e(B

e$B!!$^$:!$I8=`$Ne(B probe e$B%i%$%V%i%j$H$9$k$?$a$K$O!$e(B

(1) probe e$B$NA^F~E@$NBEEv@-$N8!>Ze(B
(2) probe e$B$NA^F~E@$NL>A0$N8!>Ze(B
(3) e$B<BAuJ}K!$N8!>Ze(B

e$B$,I,MW$+$H;W$$$^$9!%e(B(1)e$B!Ae(B(3)
e$B$^$G!$$I$l$b$^$@$H$$$&G’<1$G$$$$$G$7$g$&$+!%e(B

e$B!!%3%_%C%H$5$l$J$$$H8!>Z$b$^$^$J$i$J$$!$$H$$$&0U8+$,$"$k$+$H;W$$$^$9!%e(B

e$B!!8D?ME*$K$O!$e(B(3) e$B<BAuJ}K!$K4X$7$F!$$Ne(B DTrace
e$B0MB8$,EvJ,30$l$k$3$H$O$J$$e(B
e$B$H;W$&$N$G!$I8=`E*$JL>A0$K$J$k$3$H$K0cOB46$,$"$j$^$9!J;d$,IaCJ;H$&4D6-$Ke(B
e$B$O$J$$$7!K!%e(B(1)e$B!$e(B(2)e$B!$$*$h$Se(B (3)
e$B$N>:Y$K4X$7$F$O!$$^$@$h$/8+$F$^$;$s!%e(B

e$B!!e(BDTrace
e$B$N%5%]!<%H$r<u$1$k$3$H$,=PMh$k$h$&$K$9$k$3$H$O!$0UL#$,$"$k$H;We(B
e$B$$$^$9!%$?$@!$$=$l$J$ie(B (a) DTrace
e$B@lMQ$G$"$k$3$H$rkp$&!Je(BWin32OLE e$B$_$?$$e(B
e$B$K!$@lMQ$]$/$9$k!Ke(B (b) gem
e$B$GI8=$C$]$$$b$N$r:n$C$F;n9T:x8m$7!$I8=E:IUe(B
e$B$rA@$&!$$J$s$FJ}?K$b$"$k$s$8$c$J$$$+$H;W$$$^$9!%e(B

e$B!!$"$H!$e(Bset_trace_func e$B$N5sF0$,e(B rescue
e$B$b$R$C$+$1$k$h$&$K$J$C$F$7$^$C$Fe(B
e$BJQ$o$C$F$7$^$C$?$H$$$&$3$H$re(B IRC
e$B$GJ9$-$^$7$?!%$3$NJU$N5sF0$NJQ99$O!$:#e(B
e$B2s$NOC$H$OD>@\4X78$J$5$=$&$G$9$+$i!$JLES5DO@$7$?$[$&$,$$$$$N$G$O$J$$$Ge(B
e$B$7$g$&$+!%B?J,!$A}$($F:$$k?M$O$"$^$j5o$J$$$H;W$$$^$9$,!%e(B

e$B$"$H!$=PMh$l$P%Y%s%A%^!<%/7k2L$,$"$k$H4r$7$$$+$b!Je(Bprove e$B$r;I$5$J$$>uBVe(B
e$B$G$N!K!%e(B

e$B$"!<!"7W$C$F$+$i%3%%C%H$7$h$&$H;W$C$F$$$FK:$l$F$^$7$?!#$d$C$F$$^$7$?!#E:IU$7$^$9!#e(B (wo_w-dtrace.log)
e$B%j%S%8%g%sHV9f$,?7$7$$$[$&$,e(Bdtracee$B$rF~$l$?$d$D$G$9!#e(B

e$B$J$!"0U30$K%!<%P!<%X%C%I$,Bg$-$$$h$&$K8+$($^$7$?!#FC$KL?Na$r$R$?$9$i7+$jJV$97OE}$,CY$$$N$G!";n$7$Ke(BYARVe$BL?Na$4$H$N%H%l!<%9$r:o=|$7$F:FEY7W$C$F$_$^$7$?!#e(B
e$B$=$A$i$,e(Bwo_w-dtrace2.loge$B$K$J$j$^$9!#B>$N%H%l!<%9%a%+%K%:%`$r<h$jF~$l$k$H!"$b$C$H%*!<%P!<%X%C%I$,Bg$-$$$3$H$b9M$($i$l$^$9$7!"e(B
e$BL?Na$4$H$N%H%l!<%9$O%G%U%)%k%H$GL58z$K$7$?$[$&$,NI$$$+$bCN$l$^$;$s$M!#e(B

e$B!!L?Na$4$H$N%H%l!<%9$b$"$k$s$G$9$M!%C;$$L?Na$O?t8l$J$N$G!$$$$/$iJ,4tM=B,e(B
e$B$,F/$$$?$H$7$F$b!$e(B3
e$BL?Na$N%*!<%P%X%C%I$OBg$-$$$N$+$b$7$l$^$;$s!%e(B

e$B!!$"$H!$%Y%s%A%^!<%/e(B1e$B2s$@$1$N<B9T$O>qMp$,Bg$-$$$N$G!$e(B5
e$B2s$/$i$$$d$C$F$be(B
e$B$i$&$H$$$$$+$b$7$l$^$;$s!%e(B

$ make benchmark COMPARE_RUBY=‘before:: [before path]’ OPTS=’-r 5’

e$B$_$?$$$J!%e(B

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

(2010/01/04 21:09), Yugui wrote::

e$B!!!Ve(BDTrace e$B$r;}$D4D6-2<$G$O!W$G!$0lHLE*$JOC$8$c$J$$$G$9$h$M!%$3$l$+$ie(B
DTrace e$B$,0lHLE*$K$J$C$F$$$/$N$+$b$7$l$^$;$s$,!$8=:_$O$=$&$8$c$J$$$o$1$G!%e(B

dtracee$B$NN4@9$r8+$F!“e(BRubye$B%”%W%j%1!<%7%g%s$N1?MQ$G!V3N$+$K;H$($?$iJXMx$@$J!W$H46$8$?$N$,H/C<$G$"$k$N$O3N$+$G$9!#e(B
e$B$7$+$7!"$=$3$K0MB8$5$;$k$D$b$j$O$"$j$^$;$s!#<B:]e(BETWe$B$H$$$&0F$b$"$k$o$1$G!"$8$c$"=q$3$&$+$H;W$C$F$$$?Lp@h$G$9!#e(B

e$B!!A0$b8@$C$?$H$$j!$$^$@e(B Dtrace
e$B0MB8!$$
$h$S$=$3$+$i$N6qBNE*$JH/E8$NF;$Oe(B
e$B;d$K$O8+$($J$$$N$G!$$3$l$r8x<0e(B probe
e$B%$%s%?!<%U%’!<%9$@!$$H8@$C$F$7$^$&e(B
e$B$N$ODq93$,$"$j$^$9!%e(B

e$B!!e(BETW e$B$O:YN3EY$Je(B probe
e$B$K$O8~$-$=$&$K$J$$$J$!!$$H$$$&0u>]$,$"$j$^$9!%;ne(B
e$B$7$F$J$$$+$i$o$+$i$J$$$1$I!%e(B

e$B$=$&$G$9$M!#$I$l$b$^$@$G$9!#3+H/2q5D$K$F!"!VC/$+$,<BAu$7$F$b$N$r8+$;$F$/$l$J$$$H8!>Z$b?J$^$J$$!W$H$$$&e(B
e$B;XE&$rLc$$$^$7$?$N$G!"<BAu$7$F$_$^$7$?!#e(B

e$B!!Nc$($P!$%V%i%s%A$r@Z$C$F5DO@$9$k$N$O$I$&$G$7$g$&$+!%$=$l$@$H?J$^$J$$$+e(B
e$B$J$!!%e(B

e$B!!$3$N7o$K4X$7$F!$;d$N%9%?%s%9$O0J2<$N$h$&$J46$8$G$9!%e(B

(1) DTrace e$B$,$"$k4D6-$N?M$,9,$;$K$J$k$N$K$O;?@.!%e(B
e$B!!!%3%"$r=q$-49$($k$N$bJL$K$$$$$s$8$c$J$$$+!%e(B
e$B!!!J$J$k$Y$/JQ99$O>.$5$$J}$,4r$7$$$1$l$I!Ke(B
(2) e$B$?$@!$e(BDTrace e$B$,$J$$4D6-$G$OC/$+$,IT9,$K$J$j$=$&$J$N$G!$e(B
e$B!!!e(BUI e$BItJ,$NL>A0$dG[I[J}K!$rJQ$($FM_$7$$!%e(B e$B!!!Je(BDTrace e$B$Y$C$?$j$K$7$FM_$7$$!Ke(B e$B!!!Nc$($P!$e(BDTrace e$B$J$$4D6-$G$=$l$rMxMQ$7$?%D!<%k$rMxMQ$7$h$&$H$7$F!$e(B e$B!!!;H$($J$/$FJ86g$,Mh$=$&!%e(BDTrace e$B$Y$C$?$j$@$C$?$iJ86g8@$o$J$$$@$m$&!%e(B e$B!!!$J$i$P!$%3%"ItJ,$be(B DTrace e$B$Y$C$?$j$K$7$F$b$$$$$N$+$b!%e(B (3) DTrace e$B$G==J,7P83$r@Q$s$G$+$i!$8x<0e(B probe e$B%$%s%?!<%U%’!<%9e(B e$B!!!$H$7$F:FEY5DO@$7$?$$!%e(B1.9.3 e$B$H$+!%e(B (4) (3) e$B$KMm$`$s$G$9$,!$:#2s$Ne(B DTrace e$B%5%]!<%H$Oe(B
experimental
e$B!!!$D$C$Fe(B 1.9.2 e$B$r=P$9$H!$8e$Ge(B API
e$BJQ$($FJ86g8@$&?M$O>/$J$/$J$ke(B
e$B!!!$s$G$O$J$$$@$m$&$+!%e(B

2010/1/4 SASADA Koichi [email protected]:

(2) e$B$?$@!$e(BDTrace e$B$,$J$$4D6-$G$OC/$+$,IT9,$K$J$j$=$&$J$N$G!$e(B
UI e$BItJ,$NL>A0$dG[I[J}K!$rJQ$($FM_$7$$!%e(B

e$B$=$N7|G0$N:,5r$,!“L?Na%l%Y%k$N%H%l!<%9$O:Y$+$9$.$F;H$$>!<j$,0-$$$7%Q%U%)!<%^%s%9$K$b6A$$$F$k!”$H$$$&0J30$K8+$($J$$$s$G$9$h$M!#e(B
e$B$8$c$"!"L?Na%l%Y%k%H%l!<%9$r:o$l$PNI$$$N$+$J$!$H!#e(B

(4) (3) e$B$KMm$`$s$G$9$,!$:#2s$Ne(B DTrace e$B%5%]!<%H$Oe(B experimental
e$B$D$C$Fe(B 1.9.2 e$B$r=P$9$H!$8e$Ge(B API e$BJQ$($FJ86g8@$&?M$O>/$J$/$J$ke(B
e$B$s$G$O$J$$$@$m$&$+!%e(B

e$B$3$s$J$3$H$b$"$m$&$+$H!“e(BNEWSe$B$K$Oe(Bexperimentale$B$H=q$$$F$”$j$^$9!#e(B

é è—¤ã§ã™ã€‚

2010å¹´1月4æ—¥17:09 Yugui [email protected]:

あと,出来ればベンチマーク結果があると嬉しいかも(prove を刺さない状態
での).

あー、計ってからコミットしようと思っていて忘れてました。やってみました。添付します。 (wo_w-dtrace.log)
リビジョン番号が新しいほうがdtraceを入れたやつです。

dtrace がない環境 (Debian) でベンチマークを走らせてみたところ、いくつか
有意に速度劣化してそうなところがありました。

目で見て再現性のありそうな感じに速度劣化してそうなやつをピックアップ:

vm1_not : 2.48 3.72 (150.0%)
vm2_send : 1.12 1.46 (130.6%)
vm1_ivar : 3.70 4.47 (120.7%)
vm2_unif1 : 1.01 1.31 (129.6%)
loop_whileloop2: 0.35 0.39 (111.4%)
so_array : 4.53 5.02 (110.9%)
app_fib : 1.87 2.07 (110.8%)
so_lists : 0.96 1.06 (110.0%)
so_binary_trees: 1.08 1.17 (108.0%)
so_concatenate : 1.06 1.15 (108.0%)
loop_whileloop : 1.72 1.84 (106.7%)
so_nsieve : 8.51 9.04 (106.2%)
io_file_create : 0.71 0.74 (103.9%)
app_pentomino : 49.34 51.17 (103.7%)
so_exception : 2.75 2.83 (103.0%)
app_factorial : 0.48 0.49 (102.3%)

r26234 と r26238 で比較しています。
各ベンチマークは 5 回走らせて、その中の最速と最遅の 2 つを除いたデータの
平均で比較しています。

逆に早くなっているところもあるので、コンパイラの最適化のぶれなのかもしれ
ませんが、vm* 系のベンチマークの劣化っぷりは無視したくないですね。

ただ、うちの環境がなんか変なだけかもしれないので、誰か追試してください。

$ make benchmark COMPARE_RUBY=‘before:: ./ruby.26234’ OPTS=‘-r 5’
RUBYLIB=/home/mame/work/ruby/lib:/home/mame/work/ruby/.ext/i686-linux

benchmark.log total: 350 trial(s) (5
trial(s) for 70 benchmark(s))
…preparing
./benchmark/fasta.output.100000
…preparing
./benchmark/fasta.output.2500000
…/home/mame/work/ruby/lib/pp.rb:110:in
guard_inspect_key': undefined method untrust’ for {}:Hash
(NoMethodError)
from /home/mame/work/ruby/lib/pp.rb:77:in pp' from ./benchmark/driver.rb:100:in show_results’
from ./benchmark/driver.rb:28:in `benchmark’
from ./benchmark/driver.rb:249
make: *** [benchmark] エラー 1

↑ちなみに、benchmark スクリプトがこんな風に落ちたので raw data が得られ
ませんでした。

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

(2010/01/04 23:06), Yugui wrote::

2010/1/4 SASADA Koichi [email protected]:

(2) e$B$?$@!$e(BDTrace e$B$,$J$$4D6-$G$OC/$+$,IT9,$K$J$j$=$&$J$N$G!$e(B
UI e$BItJ,$NL>A0$dG[I[J}K!$rJQ$($FM_$7$$!%e(B

e$B$=$N7|G0$N:,5r$,!“L?Na%l%Y%k$N%H%l!<%9$O:Y$+$9$.$F;H$$>!<j$,0-$$$7%Q%U%)!<%^%s%9$K$b6A$$$F$k!”$H$$$&0J30$K8+$($J$$$s$G$9$h$M!#e(B
e$B$8$c$"!"L?Na%l%Y%k%H%l!<%9$r:o$l$PNI$$$N$+$J$!$H!#e(B

e$B!!$h$/9M$($F$_$k$H!$$d$O$j!V8x<0!W%H%l!<%9MQe(BAPIe$B$H$9$k$K$O!$$b$&>/$75DO@e(B
e$B$,MW$k$s$G$O$J$$$+!$$H$$$&46$8$G$9!%e(BDTrace
e$B$N$?$a!$FCJL!$$H$$$&$N$G$"$le(B
e$B$P!$%m!<%+%k$JOC$H$7$F=hM}$b=PMh$?$s$G$7$g$&$,!%e(B

e$B!!;H$$>!<j$H$+9M$($F%G%6%$%s$7$F$$$/$N$O!$8=:$Ne(B trunk
e$B$OE,@Z$G$7$g$&e(B
e$B$+!%e(B1.9.2 e$B$N%?%$%
%s%0<!Bh$J5$$b$7$^$9!%e(B

e$B;d$K$O8+$($J$$$N$G!$$3$l$r8x<0e(B probe e$B%$%s%?!<%U%'!<%9$@!$$H8@$C$F$7$^$&e(B
e$B$N$ODq93$,$"$j$^$9!%e(B

e$B!!e(BETW e$B$O:YN3EY$Je(B probe e$B$K$O8~$-$=$&$K$J$$$J$!!$$H$$$&0u>]$,$"$j$^$9!%;ne(B
e$B$7$F$J$$$+$i$o$+$i$J$$$1$I!%e(B

kosakie$B$G$9e(B

e$B:G?7HG$Ne(BSystemTape$B$O$9$G$K!"e(BDTrace
Probee$B$KBP1~$7$F$$$k$h$&$G$9!#e(B

http://sources.redhat.com/systemtap/wiki/AddingUserSpaceProbingToApps

e$B$H!“$$$C$F$b$4$/:G6a$J$N$Ge(Bdebiane$B$H$+0BDj;V8~$Ne(Bdistroe$B;H$C$F$k?M$O;H$($J$$$He(B
e$B;W$$$^$9$,e(B()e$B!#C/$be(BLinuxe$B$N%H%l!<%9BP1~$K6=L#$J$$$J$i;d$,$<jEA$$$7$F$b$h$$$G$9!#e(B
SystemTape$B$N%a%s%F%J$Ne(BFranke$B$H$O<c43$NLL<1$,$”$j$^$9$7!#e(B

e$B$3$l$,$&$^$/F0$/$h$&$J$iL>A0$re(BDTracee$B$[$2$[$2$K2~L>$9$k$N$OH?BP$7$?$$$G$9!#e(B
SystemTape$B$Ne(BDTracee$B8_49e(Bprobee$B5!G=$H$$$&$N$O%“%W%j%1!<%7%g%s$,Kd$a9~$`e(Bprobe
annotation
e$B$,e(BDTracee$B8_49$G%=!<%9$N0lK\2=$,2DG=$H$$$&$@$1$G$”$C$Fe(B(*2)e$B!“%f!<%6$+$i$_$k$He(B
SystemTape$B%9%/%j%W%H$G%H%l!<%9%G!<%?$r<hF@$9$k;v$K$J$k$N$G!”=cA3$?$ke(BSystemTape$B5!G=$Ke(B
e$B%f!<%6;kE@$+$i$O8+$($^$9!#e(B

(*)
e$B$“$”!"$h$/$_$?$ie(BFedorae$BFH<+%Q%C%A$G%7%9%F%`%3!<%k$rDI2C$7$F$k!#%5%$%F!<e(B

(2) systemtap-sdt-devel.rpm e$B$r%$%s%9%H!<%k$9$k$He(B
sdt.he$B$He(Bdtracee$B%3%^%s%I$,e(B
e$B%$%s%9%H!<%k$5$l$k!#e(B
#include <sys/sdt.h>
e$B$9$k$He(BDTRACE_PROBE()e$B%^%/%m$,;H$($k$h$&$K$J$k!#$^$?!"e(B
e$B6u$Ne(B
.d e$B%9%/%j%W%H=q$$$Fe(B dtrace hoge.d
e$B$H$+$9$k$H!"e(BCe$B8@8l$+$ie(Bincludee$B$G$-$ke(B
e$B%X%C%@%U%!%$%k$r<+F0@[email protected](B

[e$BK\Ev$K;(CL$K$7$+;22C$7$J$$$J!#<+J,e(B]

2010/1/5 KOSAKI Motohiro [email protected]:

e$B:G?7HG$Ne(BSystemTape$B$O$9$G$K!"e(BDTrace Probee$B$KBP1~$7$F$$$k$h$&$G$9!#e(B

e$B$“!<!”$b$C$H;~4V$,3]$+$k$+$H;W$C$F$^$7$?$,!"$b$&BP1~$7$F$k$s$G$9$M!#e(B

e$B$H!“$$$C$F$b$4$/:G6a$J$N$Ge(Bdebiane$B$H$+0BDj;V8~$Ne(Bdistroe$B;H$C$F$k?M$O;H$($J$$$He(B
e$B;W$$$^$9$,e(B()e$B!#C/$be(BLinuxe$B$N%H%l!<%9BP1~$K6=L#$J$$$J$i;d$,$<jEA$$$7$F$b$h$$$G$9!#e(B
SystemTape$B$N%a%s%F%J$Ne(BFranke$B$H$O<c43$NLL<1$,$”$j$^$9$7!#e(B

e$B$*4j$$$G$-$l$PM-$jFq$$$G$9!#e(B

e$B$3$l$,$&$^$/F0$/$h$&$J$iL>A0$re(BDTracee$B$[$2$[$2$K2~L>$9$k$N$OH?BP$7$?$$$G$9!#e(B

e$B$=$&$G$9$M!#e(B