Cache::Memcached::Fast の weight をでかくすると地球がやばい

Cache::Memcached::Fast はデフォルトで consistent hashing してくれる。で、servers に weight を渡すと振り分けの重み付けをしてくれるわけだが、これを ketama_points に大きな値を指定し、かつ 100 とかにして new したら死ぬほど遅くなった。
とある環境でいきなりインスタンス生成がクソ遅くなって、なかなか原因がわからなくて超ハマったのでメモ。
考えてみれば ketama るので、超巨大な配列が内部で作られるから当然っちゃ当然。

デフォルトは ketama_points => 0 だけど、普通 200〜300 位を指定しているはず。

use strict;
use warnings;
use Benchmark qw(cmpthese);
use Cache::Memcached::Fast;

cmpthese 100 => {
    'little' => sub {
        Cache::Memcached::Fast->new({
            servers => [
                { address => 'zigorou', weight => 1.0 },
                { address => 'nekokak', weight => 1.0 },
            ],
            ketama_points => 300,
        });
    },
    'big' => sub {
        Cache::Memcached::Fast->new({
            servers => [
                { address => 'zigorou', weight => 100 },
                { address => 'nekokak', weight => 100 },
            ],
            ketama_points => 300,
        });
    },
}, 'all';

big の方は終わらない。

coderef から名前を取りたいとき

coderef から名前を取りたいなーって時がごく稀にあるわけですが、そういうときにどうするかという話。
anon のやつは __ANON__ になる。

perl 5.12.0 からは B でとれるけど、それ以前の場合は使えないので、Devel::Peek 使っとけばいいっぽい。
気のせいで、むかしから B::svref_2object($coderef)->GV->NAME; できるんですってよ!!

追記: ATTRIBUTE のなかだと動かないので、Attribute::Handler を使うか、Test::Attribute::AutoLevel の 0.03 移行でやってるアプローチを取る必要がある。

use B;
use CGI;
my $coderef = \&CGI::new;
my $funcname = B::svref_2object($coderef)->GV->NAME;
use Devel::Peek;
use CGI;
my $coderef = \&CGI::new;
my ($funcname) = Devel::Peek::CvGV($coderef) =~ /::(.*)$/;

とかなんとか

Class::Accessor::Mouse

http://d.hatena.ne.jp/gfx/20111119/1321681656
http://tokuhirom.hatenablog.com/entry/2011/11/19/152621

use 5.14.0;
package Class::Accessor::Mouse {
    use Mouse;

    sub import {
        my ($class, %args) = @_; 
        my $meta = Mouse->init_meta(for_class => scalar caller);
        for my $type (qw(rw ro wo)) {
            next unless ref $args{$type} eq 'ARRAY';
            $class->_add_attribute($meta, $type, $args{$type});
        }
        $meta->make_immutable();
    };
    sub _add_attribute {
        my ($class, $meta, $type, $attrs) = @_; 
        $meta->add_attribute($_, is => $type) for @$attrs;
    }
}

package Hoge {
    Class::Accessor::Mouse->import(
        rw => [qw/foo bar/],
    );
}

say Hoge->new->foo('bar');

MouseX::Simple の実装のほうが筋がいい