Hi. Again.
I did benchmark using BerkeleyDB (Hash) module (random select) and the number
I got was around 10,000 / sec.
I also did similar benchmark using DBD::DBM (with BerkeleyDB Hash support).
But this time, the number was too low. (less than 200 /sec).
I moved "prepare" outside loop, so DBD::DBM (BerkeleyDB) works almost twice
faster (100 -> 200 /sec) but compare to BerkeleyDB, it is still slower.
Since DBD::DBM is now using BerkeleyDB, shouldn't it perform as well as
BerkeleyDB ?? (or at least not as bad as what I got?)
Here are source codes that I used.
Thanks a lot!
####################################################
# BerkeleyDB
####################################################
use strict;
use BerkeleyDB;
use mkUtil;
my $Env = BerkeleyDB::Env->new(
-Home => '/home/mhan/DB_bench/berkeley/db',
-Flags =>
DB_INIT_MPOOL|DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_TXN|DB_CREATE|DB_RECOVER,
-LockDetect => DB_LOCK_YOUNGEST,
-ErrFile => '/home/mhan/DB_bench/berkeley/db/berkeley_error.log',
) or die "Failed to Open: $!\n";
my $time = 10;
my (%berkeleyInt, %berkeleyChar);
tie %berkeleyInt, 'BerkeleyDB::Hash',
-Env => $Env,
-Filename => "berkeleyHashInt.db",
-Flags => DB_CREATE,
or die "Cannot open 'berkeleyHashInt.db':$!\n";
my $count = 0;
my $startTime = mkUtil::printTime("BerkeleyDB::Hash:: Integer Select Start");
my $endTime = mkUtil::getTime();
while($endTime - $startTime <$time){
my %r = mkUtil::strRand();
my $rInt = $r{'integer'};
my $temp = $berkeleyInt{$rInt};
# print "$rInt - $berkeleyInt{$rInt}\n";
$endTime = mkUtil::getTime();
$count++;
}
$endTime = mkUtil::printTime("BerkeleyDB::Hash:: Integer Select End");
print "Count: $count\n";
mkUtil::printAVG($count, $time, "BerkeleyDB::Hash:: Integer Select AVG (sec)");
####################################################
# DBD::DBM - BerkeleyDB support
####################################################
use DBI;
use mkUtil;
use BerkeleyDB;
my $dbh = DBI->connect('dbi:DBM:type=BerkeleyDB');
$dbh->{RaiseError} = 1;
$dbh->{dbm_berkeley_flags} = {
'DB_CREATE' => DB_CREATE # pass in constants
, 'DB_RDONLY' => DB_RDONLY # pass in constants
};
my $time = 10;
my $count = 0;
my $startTime = mkUtil::printTime("DBD::DBM:: Integer Select Start");
my $endTime = mkUtil::getTime();
my $sth = $dbh->prepare("SELECT * FROM dbmBerkeleyInt WHERE id = ?");
while($endTime - $startTime < $time){
my %r = mkUtil::strRand();
my $rInt = $r{'integer'};
$sth->execute($rInt);
while( my $row = $sth->fetch){
# print "@$row\n";
# sleep(1);
}
$endTime = mkUtil::getTime();
$count++;
}
$endTime = mkUtil::printTime("DBD::DBM:: Integer Select End");
print "COUNT: $count\n";
mkUtil::printAVG($count, $time, "DBD::DBM:: Integer Select AVG (sec)");