プロファイラを作るために使えるAPI
サンプリングプロファイラ (言語問わず)
userland の cpu time だけ測るなら ITIMER_VTALRM
userland + syscall の時間を測るなら ITIMER_PROF
SIGPROF や SIGALRM のような signal でお知らせしてくるが
少なくとも Linux ではシグナルは秒間100回 (100 Hz) 程度が限界なので、それ以上の精度ではプロファイリングできない
別 pthread で自前タイマー
setitimer と同じようなことだが、プロセスが CPU 使ってるときだけカウント、みたいな器用なことはできない
しかし signal の性能限界に縛られない
トレーシングプロファイラ (Ruby)
↓ は実装された順
毎回 binding を生成するので遅いとのこと (ko1)
毎回 binding を生成しないことで set_trace_func() より速くなったやつ
しかしコールバックにろくに情報をくれない、あんまり便利じゃない API である
コールバック関数が発火したタイミングでどうにかして今いた関数を得ないといけない
rb_frame_method_id_and_class() みたいなので
TracePoint (C) を使ったほうがいいと思う osyoyu.icon
機能的にはいい API
:line とかを設定するとむちゃくちゃパフォーマンスインパクトある(それはそう)
Ruby メソッドを呼び出すので必然的に遅い
遅くてもいい解析などでは有用だけど、production に投入するのはちと無理そう osyoyu.icon
ちゃんと性能測定はしたいが
機能的には TracePoint だが、C API 経由で設定して C 関数を呼び出してくれる
rb_add_event_hook2
名前がひどい
トレーシングプロファイラ (Python)
Python 界では "deterministic profiling" と呼ぶ
profile API (setprofile/getprofile)
cProfile API
トレーシングプロファイラ (Go)