Hi,

I was trying to perform some fairly simple benchmarks comparing
Rose::DB::Object, Class::DBI and an in-house solution and came up with
some disappointing results from Rose::DB::Object.

I'd like to know if there's something I did wrong or that could be
done in a better way since RoseDB was only marginally faster (about
40%) than Class::DBI (vanilla, without prefetch, nothing).

The benchmark code follows:
<code>
use warnings;
use strict;

package CidadeDBI;
use base 'Class::DBI';

__PACKAGE__->connection("dbi:mysql:database=barcode;host=xxxxxxxx",
"root", "xxxxxxxx");
__PACKAGE__->table("cidade");
__PACKAGE__->columns(All => qw|id nome estado|);
__PACKAGE__->has_a(estado => 'EstadoDBI');
1;

package EstadoDBI;
use base 'Class::DBI';

__PACKAGE__->connection("dbi:mysql:database=barcode;host=xxxxxxxx",
"root", "xxxxxxxx");
__PACKAGE__->table("estado");
__PACKAGE__->columns(All => qw|id nome pais|);
__PACKAGE__->has_a(pais => 'PaisDBI');
1;

package PaisDBI;
use base 'Class::DBI';

__PACKAGE__->connection("dbi:mysql:database=barcode;host=xxxxxxxx",
"root", "xxxxxxxx");
__PACKAGE__->table("pais");
__PACKAGE__->columns(All => qw|id nome|);
1;

package RDBSetup;

use base 'Rose::DB';
use Rose::DB::Registry;

# Create a private registry for this class
__PACKAGE__->registry(Rose::DB::Registry->new);

# Register your lone data source using the default type and domain
__PACKAGE__->register_db(
        driver   => 'mysql',
        database => 'barcode',
        host     => 'xxxxxxxx',
        username => 'root',
        password => 'xxxxxxxx',
);

1;

package CidadeRDB;
use base 'Rose::DB::Object';

__PACKAGE__->meta->table('cidade');
__PACKAGE__->meta->columns(qw|id nome estado|);
__PACKAGE__->meta->primary_key_columns('id');
__PACKAGE__->meta->foreign_keys(
        estado_obj => {
                class       => 'EstadoRDB',
                key_columns => { estado => 'id' },
        }
);
__PACKAGE__->meta->initialize;
__PACKAGE__->meta->make_manager_class('cidade');

sub init_db { RDBSetup->new }

1;

package EstadoRDB;
use base 'Rose::DB::Object';

__PACKAGE__->meta->table('estado');
__PACKAGE__->meta->columns(qw|id nome pais|);
__PACKAGE__->meta->primary_key_columns('id');
__PACKAGE__->meta->foreign_keys(
        pais_obj => {
                class       => 'PaisRDB',
                key_columns => { pais => 'id' },
        }
);
__PACKAGE__->meta->initialize;
__PACKAGE__->meta->make_manager_class('estado');

sub init_db { RDBSetup->new }

1;

package PaisRDB;
use base 'Rose::DB::Object';

__PACKAGE__->meta->table('pais');
__PACKAGE__->meta->columns(qw|id nome|);
__PACKAGE__->meta->primary_key_columns('id');

__PACKAGE__->meta->initialize;
__PACKAGE__->meta->make_manager_class('pais');

sub init_db { RDBSetup->new }

1;

package main;
use warnings;
use strict;

use Benchmark 'cmpthese';

cmpthese(200, {
        CDBI    =>      \&CDBI,
        RDB             =>      \&RDB
});

sub RDB {
        for my $cidade (@{CidadeRDB::Manager->get_cidade(query=>[nome=> {
like => '%a%' },])}) {
                my $x = $cidade->id;
                my $y = $cidade->nome;
                my $z = $cidade->estado_obj;
                
                my $var = $cidade->estado_obj->pais_obj->nome;
        }
}

sub CDBI {
        for my $cidade (CidadeDBI->search_like({nome =>'%a%'})) {
                my $x = $cidade->id;
                my $y = $cidade->nome;
                my $z = $cidade->estado;
                
                my $var = $cidade->estado->pais->nome;

        }
}
</code>

Thanks for any advice.

-Nilson Santos F. Jr.


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid3432&bid#0486&dat1642
_______________________________________________
Rose-db-object mailing list
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object

Reply via email to