Devel::NYTProfのプロファイラーを試しみた
3,4ヶ月前にPerlで200行ぐらいのコードを書いた。「Perlを最適化する
」サイトを参考にコードの最適化とスレッド化をして実行時間を短縮した。けれども、プロファイラーを使用してどこに時間がかかっているのか、知りたくなった。
先ず、Devel::FastProfというプロファイラーをインストール使用しようとしたが、失敗。cpanの公式サイトを見ると、BUGSの見出しの下にNo Windows! No threadsとあるので、Window版ではインストールできないようだ。半日かかった。orz
次に他のプロファイラに替わり、デファクトスタンドとなったDevel::NYTProfというNew York Timesの有志で作られたモジュールをインストール。
実行は、
perl.exe -d:NYTProf xxxxx.pl
実行結果は、オプションで指定しなければカレントフォルダにnytprof.outが作成される。これはDBファイルなので、そのまま見ることができず、
nytprofhtmlコマンドか、nyprofcsvコマンドを実行することによって、htmlファイルまたはcsvファイルが作成される。
どちらのコマンドも、カレントフォルダにnytprofというフォルダ内にモジュール単位にファイルが作成される。
フォルダ内にindex.htmlをブラウザで開くと、トップにグラフとその次にTop15のサブルーチン名称とコール回数や経過時間等が表形式で表示される。
最下段には、ソースファイル毎に経過時間とさらにそのソースファイルのリンクが表示される。
リンクをクリックすると、ここでも、サブルーチンごとの経過時間の表が上にあり、下段には、ソースコードの1行毎経過時間が表示される。
これは、すごい!!
p.s.
参照サイトの一番下段は、Devel::NYTProfの作成者が書いたこのプロファイラの紹介と最適化の方法が書かれています。
参照サイト:
Perl スクリプトで遅い場所を特定する方法 - Devel::Profiler / Devel::NYTProf - drk7jp
Devel::FastProf - "fast" perl per-line profiler - metacpan.org
Devel::NYTProf - Powerful feature-rich perl source code profiler - metacpan.org
オランダ坂珈琲邸 メール会員について
突然、エクスプローラーとMicrosoft Edgeがおかしくなった
突然、エクスプローラーとMicrosoft Edgeがおかしくなりました。症状としては、エクスプローラーは起動しますが、ファイルを選択して、右メニューの表示がおかしくなります。また、Microsoft Edgeも同様に起動はしますが、数秒後に終了します。
イベントログもアプリケーションログにID:1000として、ログが出力されています。
詳細にログの調査は行っていませんが、対処方法として、再起動を3回行ったところ、エクスプローラーとMicrosoft Edgeとも無事に修復しました。
なんだか、気持ちが悪いです。
Perl File::ReadBackwards を使用してみた
PerlでFile::ReadBackwardsモジュールを使用してみました。このモジュールは、ファイルを逆から読み込むので、ファイルの最後付近にある文字列を抽出したい場合に役立ちます。
使用しているPerlはWindows版なので、このモジュールのレコードセパレータは\r\nなりますが、読み込むファイルはWindows版のcurlの-oオプションの出力ファイルなのに、なぜかレコードセパレータは\nでした。
幸い、このモジュールには、レコードセパレータを変更できるようにnewメソッドの第2引数で指定できます。
修正前:
my $bw = File::ReadBackwards->new($html_file);
修正後:
my $bw = File::ReadBackwards->new($html_file,"\n");
\nは、ダブルクォーテーションで囲ってください。シングルクォーテーションでは、\とnの文字列を改行として認識して、意図した動作をしません。
Perl readline() on closed filehandle
普段は、あるディレクトリの下にファイルを作成していますが、今回、少しでも高速にしようと、RAMディスクのEドライブ直下に書き込みを行っていました。一度目は、ファイルのオープンからクローズまで正常に終了するのですが、再度、実行すると、再オープンに失敗し、タイトルのエラーとなりました。
修正前:
open(FD, "< E:text.log");
修正後:
open(FD, "< E:\\text.log");
PerlがWindows版なので、ディレクトリの区切りには\を2度、重ねることは知っていましたが、ドライブとファイル名の間にも必要でした。
p.s.
また、しょうもないことで時間を食ってしまいました。orz