gaggitのブログ

コーディング、ガジェット、TIPS関連、FX

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を最適化する

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

http://assets.en.oreilly.com/1/event/45/Understanding%20and%20Optimizing%20your%20Code%20with%20Devel__NYTProf%20Presentation.pdf

オランダ坂珈琲邸 メール会員について

先日、オランダ坂珈琲邸のWiFiサービスについて書いたが、以前からあるメール会員サービスの登録方法について書いてみる。

お店に行けば、登録用のURLが記載された紙がレジにおいてあるが、ネットにはないようだ。

登録用URLは

http://kotakitaplus.jp/ozkxxx

xxxには、3桁の数字が入り、

001 東大和

003 東所沢店

004 西谷店

005 町田金井店

のようだ。

ブラウザに上記のアドレスを入力し、空メール送信のボタン押す。

メーラーに届いたURLにアクセスして、必要事項を入力する。

再度、メールが届くので、URLにアクセスして、ブックマークに登録。

 

 

 

 

オランダ坂珈琲邸でWiFiサービスが始まっていた

約2か月ぶりにオランダ坂珈琲邸に行ってみたら、WiFiサービスが始まっていました。

SSIDとパスワードは、以下です。

SSID:orandazakacoffee

PASS:non-password

 

あと、スタンプカードのサービスが終了していました。まー、こちらは、スマホの画面を見せたら、飲み物のお代わりのサービスがあるから、しょうがないかも。。。

 

突然、エクスプローラーとMicrosoft Edgeがおかしくなった

突然、エクスプローラーとMicrosoft Edgeがおかしくなりました。症状としては、エクスプローラーは起動しますが、ファイルを選択して、右メニューの表示がおかしくなります。また、Microsoft Edgeも同様に起動はしますが、数秒後に終了します。

 

イベントログもアプリケーションログにID:1000として、ログが出力されています。

詳細にログの調査は行っていませんが、対処方法として、再起動を3回行ったところ、エクスプローラーとMicrosoft Edgeとも無事に修復しました。

 

なんだか、気持ちが悪いです。

 

 

Perl File::ReadBackwards を使用してみた

 PerlでFile::ReadBackwardsモジュールを使用してみました。このモジュールは、ファイルを逆から読み込むので、ファイルの最後付近にある文字列を抽出したい場合に役立ちます。

使用しているPerlWindows版なので、このモジュールのレコードセパレータは\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");

 

PerlWindows版なので、ディレクトリの区切りには\を2度、重ねることは知っていましたが、ドライブとファイル名の間にも必要でした。

 

p.s.

また、しょうもないことで時間を食ってしまいました。orz

 

 

 

 

Perl Undefined subroutineが出たら、やってみたいこと

Perlのモジュールの中のサブルーチンを使用していますが、Perlを実行すると、「Undefined subroutine &main::サブルーチン名」と表示され、エラーとなる場合があります。

その時には、以下のようにソースを修正するとうまくいきます。

修正前:

use モジュール名;

修正後:

use モジュール名 qw(サブルーチン名);

または、

use モジュール名 qw(:ALL);