名古屋ギークバーに行ってきた

麻雀回でした

とりあえず,Perl6 のNagoya.pm でやってた続きをする.
必要な機能は,テストから調べる.ことはわかったので
普通のプログラミングで必要なことを考える.

今は遅いのをなんとかしたいので,プロファイラかな.ぐぐる

docs/dev/profiling.pod - Profiling Parrot

# Copyright (C) 2001-2005, Parrot Foundation.

=head1 NAME

docs/dev/profiling.pod - Profiling Parrot

=head1 DESCRIPTION

このファイルは,Parrot のプロファイリング実行部分の使用方法について記述している.

=head2 Summary

プロファイル実行環境は,Parrot の一部として作られており,PIRコードのボトルネックを発見できるように設計されています.HLL(?)プロファイルをサポートするために実装されていますが,現在では制限があります.C<parrot>バイナリィに C<-Rprofiling> や C<--runcore profiling>を渡すことで,コードはプロファイリング実行環境下で実行されます.出力ファイルの位置とフォーマットは,次に記述されるように環境変数によって決定されます.プロファイリング実行環境が関連する環境変数を発見できない場合は,次で書かれるようなデフォルト値を使います.

=head2 環境変数

=over 4

=item C<PARROT_PROFILING_FILENAME>

もしあれば,出力が書かれるファイルの完全な名前を決定します.Parrot は,書くために開く前にファイル名が存在するかどうかをチェックをせず,以前のプロファイルが含む既存のファイルを偶然にも上書きしてしまうでしょう.

値が設定されていなければ,Parrot はファイルをC<parrot.pprof.X> に書き出します.ここで,X はParrot プロセスのPID です.プロファイリング実行部分が存在する場合,プロファイルが書かれるときにアナウンスするメッセージを出力します.

この変数は,C<stdout> や C<stderr> という特殊な値を持つこともできます.それらの値のどちらかが(大文字小文字に関係無く) 見つかった場合,Parrot はプロファイリングの結果をstdout か stderr に出力します.

=item C<PARROT_PROFILING_OUTPUT>

これは,プロファイルを含む出力のタイプを決定します.現在のオプションは,C<pprof> と C<none>です.C<pprof> は,デフォルトであり,ASCII 文字であるため,人間が読めるような形式です.これは,tools/dev/pprof2cg.pl によって後処理して,Callgrind 互換のフォーマットに変換できます.C<none> は,結果ファイルを書き出しません.これは,主にプロファイリングの実行部分自身のテストや最適化にとって有用です.これは,PIR とHLL コードをプロファイルしたいユーザにとってあまり意味がないことを期待されています.

=item C<PARROT_PROFILING_ANNOTATIONS>

これは,PIR アノテーションがプロファイルの一部として記録されるように設定します.アノテーションは,HLL コードをプロファイリングするのに必要ですが,プロファイリングの実行部分をより遅くします.デフォルトでは,それらは無効です.それらを有効にするために,この値を設定します.

=item C<PARROT_PROFILING_CANONICAL_OUPUT>

これが設定されている場合,プロファイリングの実行部分は,全てのアドレスを1つの定数値として,全ての時刻を1として記録します.このオプションは,与えられたコードの部分が常に同じプロファイルを正確に生成することを保証する方法があると便利な場所,主にテスト用に便利です.この機能を有効にしたい場合,多分ランダムなハッシュシードに起因する非決定的な振舞いを避けるために C<--hash-seed 1324> を使ってParrot に特定のハッシュシードも渡したいと思うでしょう.

この変数はテストやプロファイリングの実行部分から離れては有用ではありません.そしてユーザのコードのホットスポットを見つけるために殆ど確実に助けにもなりません.

=back

=cut

つまり,Cバイナリィに C<-Rprofiling> や C<--runcore profiling> を渡すということですね.

で,よく見ると /rakudo-star-2011.07/parrot-3.6.0/tools/dev/pprof2cg.pl に,pod もあった.

$ parrot -Rprofiling <workdir>/rakudo-star-2011.07/install/lib/parrot/3.6.0/languages/perl6/perl6.pbc <scriptname>
$ perl <workdir>/rakudo-star-2011.07/install/lib/parrot/3.6.0/tools/dev/pprof2cg.pl parrot.pprof.XX

pprof2cg.pl は,Callgrind-compatible 互換ファイルを出力するらしいので
valgrind をインストールしたけど,そもそもcallgrind のファイル見るのは,
kcachegrind だった…

$ sudo brew install --HEAD valgrind     # Lion だとhead しか対応してなかった
$ sudo brew install qt --with-qt3support
$ rehash
$ wget http://kcachegrind.sourceforge.net/kcachegrind-0.7.0.tar.gz
$ tar xf kcachegrind-0.7.0.tar.gz
$ cd kcachegrind-0.7.0/qcachegrind
$ qmake
$ make
$ ./qcachegrind.app/Contents/MacOS/qcachegrind

これで parrot.out.$PID ファイルが読めます.

ご参考

で見てみたんだけど,

これは,Perl6;Perl6Role;ACCEPTS(Role.pir) に時間がかかってるんですよね?

次はpir を読む流れ?

PEG を見よというおつげを頂いた

  • 10/22 valgrand の辺を追記