CodeReposに初アップ

今まで上げよう上げようと思っていて、なかなか上げられなかったのですが今日ようやく初アップしました。

lang/perl/Method-Cached
http://coderepos.org/share/browser/lang/perl/Method-Cached/trunk

テストの中途半端さもあったり、依存するモジュールが微妙に多かったりとまだまだ CPAN に上げられる品質ではない感じ。
使う必要のないデフォルトクラスのために Cache::FastMmap を必要としてしまう辺りはショボいのでこれから直します。

※2008/09/30、若干修正
試しにベンチマークもとったけどまだまだ遅い。

                     Rate C(FileCache) C(Memcached-Fast) C(FastMmap)     Memoize
C(FileCache)        917/s           --              -82%        -86%        -99%
C(Memcached-Fast)  5128/s         459%                --        -22%        -92%
C(FastMmap)        6536/s         612%               27%          --        -90%
Memoize           66667/s        7167%             1200%        920%          --

パラメータをシリアライズしてキャッシュキーに仕立て上げる辺りが富豪的だったりしているのでここも直す予定…

ちなみにテストに使用したコードはこちら。

#!/usr/bin/env perl

use strict;
use warnings;
use FindBin::libs;

use Method::Cached::Manager -domains => {
    'cache-memcached-fast' => {
        storage_class    => 'Cache::Memcached::Fast',
        storage_args     => [
            { servers    => [qw/ 127.0.0.1:11211 /] },
        ],
    },
    'cache-fastmmap'       => {
        storage_class    => 'Cache::FastMmap',
        storage_args     => [
            share_file     => '/tmp/fastmmap.bin',
            unlink_on_exit => 0,
        ],
    },
    'cache-file'           => {
        storage_class    => 'Cache::FileCache',
    },
};

{
    package Dummy;

    use Method::Cached;
    use Attribute::Memoize;

    sub fib_memcached : Cached('cache-memcached-fast', 5) {
        my $n = shift;
        return $n if $n < 2;
        fib_memcached($n - 1) + fib_memcached($n - 2);
    }

    sub fib_fastmmap : Cached('cache-fastmmap', 5) {
        my $n = shift;
        return $n if $n < 2;
        fib_fastmmap($n - 1) + fib_fastmmap($n - 2);
    }

    sub fib_file : Cached('cache-file', 5) {
        my $n = shift;
        return $n if $n < 2;
        fib_file($n - 1) + fib_file($n - 2);
    }

    sub fib_memoize : Memoize {
        my $n = shift;
        return $n if $n < 2;
        fib_memoize($n - 1) + fib_memoize($n - 2);
    }
}

package main;

use Benchmark;

my ($mc_fib, $fm_fib, $f_fib, $m_fib);

sub mc_fib { $mc_fib = 10; $mc_fib = Dummy::fib_memcached($mc_fib) }
sub fm_fib { $fm_fib = 10; $fm_fib = Dummy::fib_fastmmap($fm_fib)  }
sub f_fib  { $f_fib  = 10; $f_fib  = Dummy::fib_file($f_fib)       }
sub m_fib  { $m_fib  = 10; $m_fib  = Dummy::fib_memoize($m_fib)    }

Benchmark::cmpthese(10000, {
    'C(Memcached-Fast)' => \&mc_fib,
    'C(FastMmap)'       => \&fm_fib,
    'C(FileCache)'      => \&f_fib,
    'Memoize'           => \&m_fib,
});