Простейший трейс включается переменной окружения DBIC_TRACE=1. Сейчас каждый запрос будет выводиться на STDERR перед выполнением.

Но что, если нам его недостаточно? Посмотрим, что нам даёт DBIx::Class. А даёт он нам класс DBIx::Class::Storage::Statistics.
Методы этого класса вызываются до и после каждого запроса, либо транзакции.

Попробуем после каждого запроса выводить время, которое он исполнялся. Это описано в DBIx::Class::Manual::Cookbook.

Добавляем схему:

  __PACKAGE__->storage->debugobj(new My::Profiler());
  __PACKAGE__->storage->debug(1);

И создаём модуль:

  package My::Profiler;
  use strict;
 
  use base 'DBIx::Class::Storage::Statistics';
 
  use Time::HiRes qw(time);
 
  my $start;
 
  sub query_start {
    my $self = shift();
    my $sql = shift();
    my $params = @_;
 
    $self->print("Executing $sql: ".join(', ', @params)."\n");
    $start = time();
  }
 
  sub query_end {
    my $self = shift();
    my $sql = shift();
    my @params = @_;
 
    my $elapsed = sprintf("%0.4f", time() - $start);
    $self->print("Execution took $elapsed seconds.\n");
    $start = undef;
  }
 
  1;

Отлично. Сейчас после каждого запроса пишется время выполнения. Если мы в My::Profile::print мы заменим print на carp, то после каждого SQL-запроса мы получим место его выполнения.

Но время выполнения запроса – это средняя температура по больнице, потому что может быть много быстрых запросов. Хотелось бы получить более красивую статистику. И она есть – DBIx::Class::QueryLog

Этот модуль сохраняет статистику по каждому выполненному запросу, группирует одинаковые запросы и сортирует по суммарному времени выполнения. Как им пользоваться – написано в документации. Свою задачу – ткнуть Вас носом в интересную фичу DBIx::Class – я выполнил.
Удачной Вам разработки.

Сегодня утром получил такое интересное письмо:

Привет! Это не спам :)

Я включил вас в список русских CPAN-авторов (Acme::CPANAuthors::Russian), т.к. вы очень похоже на русских )))
Если я ошибся и вы не хотите находится в этом списке, дайте мне знать.

Спасибо!

use Perl or die;

Так приятно видеть в этом списке аццкое количество сотрудников Рамблера :-)

use feature 'say';
say scalar(localtime(1234567890))


Sat Feb 14 02:31:30 2009

Расскажу вам про очень полезную вешь. Которую я даже сам редко использую. Прочёл я о ней в книге Стива Макконнела “Совершенный код”. Это Библия программиста. Советую прочесть всем.

Псевдокод

Когда вам нужно создать метод, не нужно торопиться и писать кучу кода. Попробуйте начать работать по такой схеме:
Continue reading »

http://search.cpan.org/~zoffix/ – Дарья Донцова CPAN-а

Для начала расскажу историю. В далёком 2004-м году чувак по имени Vladi Belperchinov-Shabanski “Cade” написал модуль Algorithm::FloodControl. В те дремучие века люди не знали, что такое ООП и их заботила поддержка Perl4 :-)

Сделал апгрейд этому модулю. Сделал его ООП-шным, добавил поддержку backend-ов для Cache::Memcached::Fast, Cache::FastMmap. Сделал и для Cache::Memcached, ибо не сложно три строки написать, но когда 15 процессов инкрементят запись, то срабатывает от силы 10% инкрементов. Ниипу почему.

Наверное, ещё будут бока с документацией. Это я поправлю.

Algorithm-FloodControl-1.90

© 2012 Андрей Костенко Suffusion theme by Sayontan Sinha