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

MySQLで文字化け@さくらレンタルサーバー

それでも化ける模様。
以下の設定が必要。

my $connect_info = ['dbi:mysql:dbname:hostname', 'username', 'password'];
my $schema = MySchema->connect(@$connect_info);
$schema->storage->dbh->do("SET NAMES utf8"); # これ

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.

CSSの勉強(あるいはパクリ)用サイトメモ

デザインとかよくわかんないからパクリ用