constant.pm は遅い?ベンチマーク取ってみた
base.pm のソース眺めてたら constant.pm は遅いからと自前でインライン関数(?)を定義していた。
# constant.pm is slow sub SUCCESS () { 1 } sub PUBLIC () { 2**0 } sub PRIVATE () { 2**1 } sub INHERITED () { 2**2 } sub PROTECTED () { 2**3 }
で、どれくらい遅いのかなーとベンチマーク取ってみた。(Benchmark モジュールで遊んでみたかっただけとも言う)
コード
問題になるのは定数へのアクセス時間だろうから、単純に変数への代入だけしてみる。
#!/usr/bin/env perl use strict; use warnings; use Benchmark qw(cmpthese); use constant TRUE1 => 1; use constant FALSE1 => 0; sub TRUE2() { 1 } sub FALSE2() { 0 } my $var; my $r = cmpthese(-1, { const => sub { $var = TRUE1; $var = FALSE1; }, subr => sub { $var = TRUE2; $var = FALSE2; } });
結果はこんな感じ。5回分。
Rate subr const subr 10840892/s -- -6% const 11504751/s 6% -- Rate subr const subr 10334308/s -- -3% const 10632413/s 3% -- Rate subr const subr 10632413/s -- -2% const 10840892/s 2% -- Rate subr const subr 11261401/s -- -3% const 11568578/s 3% -- Rate subr const subr 10735641/s -- -1% const 10794164/s 1% --
せいぜい数パーセントなんで、普通に使う分には気にしなくていいと思うんだけど、モジュール作る側の人はそれでも気になるのかもしれない。
(そもそも base と parent の違いを調べていたんだった。速度も含めて問題にはならないと Perl CPANモジュールガイド にはあるんだけど、どうなんだろうと思って。base と parent もギリギリまで高速化・単純化したい人には違いが気になるんだろうか)
それにしても Perl はベンチマーク取るのが簡単で楽しいですね!
おまけ
プロトタイプ宣言した関数がほんとにインライン化されてるか確かめるには Deparse 使うらしい。
% perl -MO=Deparse -e 'sub TRUE() { 1 }; print "loop" while(TRUE)' sub TRUE () { 1 } print 'loop' while 1; -e syntax OK
さくらのレンタルサーバーへのssh接続がすぐ切られる問題の対処
これでよさげ
% cat ~/.ssh/config Host * ServerAliveInterval 600 # 10分
追記
あれ?これじゃだめかも?
MySQLでデータのexport/import
ハマったのでメモ。(ローカルからさくらのレンタルサーバーにデータを移すとき)
# Export (local): mysqldump dbname table1 table2 ... > dump.sql # Import (sakura): mysql -u username --password=password -D dbname -h hostname < dump.sql
"no moose"とtypoすると(mが小文字)、警告が大量に出る件
Moose使ってて、何か警告いっぱい出るようになったなぁと思ったらタイポして "no moose" なんてやってただけだった。エラーにはならないから見逃しがち。(いや警告もちゃんと直しましょう)
出てた警告:
Subroutine throw_error redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 42. Subroutine extends redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 48. Subroutine with redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 59. Subroutine has redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 63. Subroutine before redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 75. Subroutine after redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 79. Subroutine around redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 83. Subroutine super redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 91. Subroutine override redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 98 . Subroutine inner redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 104. Subroutine augment redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 118 . Subroutine init_meta redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 1 35. Subroutine _get_caller redefined at /Users/naoto/perl5/perlbrew/perls/perl-5.12.2/lib/site_perl/5.12.2/darwin-2level/moose.pm line 228.