CDBIとDBICのベンチマーク3

http://d.hatena.ne.jp/tokuhirom/20060128/1138424747
id:tokuhiromさんが、教えてくれたコードをちょっといじってみた。


package CDBI;
use strict;
use warnings;
use base 'Class::DBI';
use SQL::Abstract;
__PACKAGE__->connection('dbi:mysql:nekodb', 'nekokak', '******');
__PACKAGE__->table('order_cust');
__PACKAGE__->columns( Primary => qw[ id ]);
__PACKAGE__->columns( Essential => qw[ name ]);
__PACKAGE__->set_sql(DeleteFromSQL => q{
DELETE FROM
__TABLE__
WHERE %s
});
sub abstract_delete {
my $class = shift;
my $where = (ref $_[0]) ? $_[0] : { @_ };
my($phrase, @bind) = SQL::Abstract->new->where($where);
$phrase =~ s/^\s*WHERE\s*//s;
my $sth = $class->sql_DeleteFromSQL($phrase);
my $ret = $sth->execute(@bind);
$sth->finish;
return $ret;
}
1;

1000レコードをdeleteさせた結果。


Benchmark: timing 1 iterations of CDBI, DBIC...
CDBI: 0 wallclock secs ( 0.08 usr + 0.05 sys = 0.13 CPU) @ 7.69/s (n=1)
(warning: too few iterations for a reliable count)
DBIC: 0 wallclock secs ( 0.02 usr + 0.01 sys = 0.03 CPU) @ 33.33/s (n=1)
(warning: too few iterations for a reliable count)

かなり改善されました。
トリガーを効かせる要件がなければこっちの方がいいでつね。
abstract_deleteってメソッド名がイタイところ。いいメソッド名募集w

CDBIのパフォーマンス改善の一つにid:lestrratさんのhttp://d.hatena.ne.jp/lestrrat/20060130#1138586775も、大変参考になります。
これは即適用したいですねぇ。