Forum Webscript.Ru
Программирование => Perl => Тема начата: Chs от 09 Апреля 2002, 16:20:38
-
#!/usr/bin/perl
use Benchmark qw(cmpthese);
cmpthese(1000,{\'DBI\'=> \\&selDBI, \'MySql\'=> \\&selMysql});
sub selDBI()
{
use DBI;
my $dbh=DBI->connect("DBI:mysql:database=test;host=localhost","root",\'\',{RaiseError=>1});
$sth=$dbh->prepare_cached("select * from test");
$sth->execute();
while(my @ar=$sth->fetchrow_array())
{
}
$dbh->disconnect();
}
sub selMysql {
use Mysql;
my $dbh = Mysql->connect(\'localhost\',\'test\',\'root\',\'\');
my $sth=$dbh->query("select * from test");
while(my @arr=$sth->fetchrow())
{
}
undef $dbh;
}
---------- Perl Run ----------
Benchmark: timing 1000 iterations of DBI, MySql...
DBI: 160 wallclock secs (160.17 usr + 0.00 sys = 160.17 CPU) @ 6.24/s (n=1000)
MySql: 181 wallclock secs (181.58 usr + 0.00 sys = 181.58 CPU) @ 5.51/s (n=1000)
Rate MySql DBI
MySql 5.51/s -- -12%
DBI 6.24/s 13% --
Normal Termination
Output completed (5 min 48 sec consumed).
Вот так! DBI - рулит! :))
-
Creator
Я думаю, ты уже догадался, что речь идет о форуме, а именно о iB3.0.2. Я регулярно общаюсь с одним из разработчиков оного, и то мне и сообщил, что с сиквеловской базой он будет работать несколько быстрее, но выигрыш можно получить только в слкчае, если база имеет "на борту" более 10 тыс. записей. Скажем так, я ему поверил на-слово, так как человек он авторитетный.
А я не поверил.:) В документации ясно написано что модуль Mysql реализован через DBI.
Итак:
select count(*) from test
10995
#!/usr/bin/perl
use Benchmark qw(cmpthese);
cmpthese(10,{\'DBI\'=> \\&selDBI, \'MySql\'=> \\&selMysql});
sub selDBI()
{
use DBI;
my $dbh=DBI->connect("DBI:mysql:database=test;host=localhost","root",\'\',{RaiseError=>1});
$sth=$dbh->prepare_cached("select * from test");
$sth->execute();
while(my @ar=$sth->fetchrow_array())
{
}
$dbh->disconnect();
}
sub selMysql {
use Mysql;
my $dbh = Mysql->connect(\'localhost\',\'test\',\'root\',\'\');
my $sth=$dbh->query("select * from test");
while(my @arr=$sth->fetchrow())
{
}
undef $dbh;
}
---------- Perl Run ----------
Benchmark: timing 10 iterations of DBI, MySql...
DBI: 163 wallclock secs (162.19 usr + 0.00 sys = 162.19 CPU) @ 0.06/s (n=10)
MySql: 179 wallclock secs (179.39 usr + 0.00 sys = 179.39 CPU) @ 0.06/s (n=10)
s/iter MySql DBI
MySql 17.9 -- -10%
DBI 16.2 11% --
Normal Termination
Output completed (5 min 46 sec consumed).
Т.е. выигрыш DBI примерно те же 10%, как и на маленьких базах.
Обкурился разработчик IB и гонит.:)))
-
To Chs:
Согласен.
Нельзя доверять"авторитетам".
-
2Chs
;) хы, а ты где тесты проводил?
Помнишь, я тут недавно тесты map vs foreach кидал.
Там у меня под Win map в 9 раз быстрее, у тебя на 30% медленее, а под linux map оказался тоже несколько медленее.
Я к тому, что если вышеприведенные тесты были под win то стоит под *nix потестить - может ситуация несколько изменится ( ;) не удивлюсь, если отрыв увеличится)
-
Я к тому, что если вышеприведенные тесты были под win то стоит под *nix потестить - может ситуация несколько изменится ( не удивлюсь, если отрыв увеличится)
У меня нет сейчас доступного nix сервера с Mysql.
Но я тоже думаю, что отрыв скорее увеличиться.:))
-
Но я тоже думаю, что отрыв скорее увеличиться.
FreeBSD/MySQL 3.22.27
:) Выигрыш DBI получился на маленькой БД (одна таблица, две колонки, одна запись) ~19-20% а на большой (место база занимает 875мега) разброс большой получился. От 4 до 37(!)%.
-
FreeBSD/MySQL 3.22.27
NeoNox, спасибо!
37% - вообще впечатляет.:))
-
вообще впечатляет.
меня тоже, но думаю этот показатель нельзя брать за основу. В среднем так и осталось 10-20% ...
-
Вот еще интересно, во время тестирования
в подпрограммах
use DBI; и use Mysql;
.. подключение модулей выполняется на каждой итерации или все-таки один раз (в самой первой итерации)?
т.к. MySql он же и себя + DBI подгружает
(кстати, может оно у меня так конечно, но это он через require делает)