2009-08-06 2 views
0

Я планирую перейти от класса :: DBI к Rose :: DB :: Object из-за его хорошей структуры и жаргона, который RDBO быстрее сравнивает с CDBI и DBIC.Является ли моя Rose :: DB :: Компиляция объекта слишком медленной?

Однако на моей машине (Linux 2.6.9-89, Perl 5.8.9) RDBO скомпилирован времени гораздо медленнее, чем CDBI:

 
$ time perl -MClass::DBI -e0 
real 0m0.233s 
user 0m0.208s 
sys  0m0.024s 

$ time perl -MRose::DB::Object -e0 
real 0m1.178s 
user 0m1.097s 
sys  0m0.078s 

Это намного разные ...

Кто-нибудь испытывает подобное поведение здесь?

Cheers.


@manni и @John: спасибо за разъяснение о модулях, на которые ссылается RDBO, это, безусловно, отвечает, почему во время компиляции происходит медленнее, чем CDBI.

Приложение не работает в постоянной среде. Фактически это вызвано несколькими одновременными заданиями cron, которые работают через 2 минуты, 5 минут и x минут. Поэтому да, время компиляции здесь имеет решающее значение ...

Приложение Джонатана Рокуэля :: Стойкость кажется интересной, однако ее (текущее) ограничение, позволяющее использовать только одно приложение одновременно, не подходит для моей цели. Также он имеет проблему, когда мы убиваем клиента, процесс сервера все еще работает ...

+0

Время загрузки является проблемой только в том случае, если вы не работаете в постоянной среде (например, mod_perl или FastCGI), и вы действительно должны быть (нет оправдания, так как хостинг FastCGI в наши дни так дешев). Кроме того, для большинства приложений любого результата время выполнения - это намного больший процент от общего времени, чем просто запуск. – mpeters

+0

@mpeters: Кто сказал, что собирается построить какое-то веб-приложение? – innaM

ответ

1

Это выглядит почти так же драматично здесь:

time perl -MClass::DBI -e0 
real  0m0.084s 
user  0m0.080s 
sys  0m0.004s 

time perl -MRose::DB::Object -e0 
real  0m0.391s 
user  0m0.356s 
sys  0m0.036s 

Боюсь, часть разницы может быть объяснена число зависимостей в каждом модуле:

perl -MClass::DBI -le 'print scalar keys %INC' 
46 

perl -MRose::DB::Object -le 'print scalar keys %INC' 
95 

конечно, вы должны спросить себя, сколько времени компиляции действительно имеет значение для вашей конкретной проблемы. И какой исходный код будет проще поддерживать для вас.

5

Rose::DB::Object просто содержит (или ссылки с других модулей) гораздо больше кода, чем Class::DBI. С яркой стороны он также имеет many more features и равен much faster at runtime, чем Class :: DBI. Если время компиляции касается вас, то лучше всего загрузить как можно меньше кода (или получить более быстрые диски).

Другой вариант - установить auto_load_related_classes на false в ваших объектах метаданных. Для этого достаточно рано и в глобальном масштабе, вероятно, вам понадобится сделать подкласс Metadata, а затем установить его как meta_class в ваш общий базовый класс Rose::DB::Object.

Отключение auto_load_related_classes Отключение означает, что вам придется вручную загружать связанные классы, которые вы действительно хотите использовать в своем скрипте. Это немного боль, но это позволяет вам контролировать, сколько классов загружается. (Если у вас сильно взаимосвязанные классы, загрузка одного из них может привести к потере всех остальных.)

Возможно, у вас может быть переменная окружения для управления поведением.класс Пример метаданных:

package My::DB::Object::Metadata; 

use base 'Rose::DB::Object::Metadata'; 

# New class method to handle default 
sub default_auto_load_related_classes 
{ 
    return $ENV{'RDBO_AUTO_LOAD_RELATED_CLASSES'} ? 1 : 0 
} 

# Override existing object method, honoring new class-defined default 
sub auto_load_related_classes 
{ 
    my($self) = shift; 

    return $self->SUPER::auto_load_related_classes(@_) if(@_); 

    if(defined(my $value = $self->SUPER::auto_load_related_classes)) 
    { 
    return $value; 
    } 

    # Initialize to default 
    return $self->SUPER::auto_load_related_classes(ref($self)->default_auto_load_related_classes); 
} 

И вот как это связано с вашим общим объектом базового класса:

package My::DB::Object; 

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

use My::DB::Object::Metadata; 

sub meta_class { 'My::DB::Object::Metadata' } 

Затем установить RDBO_AUTO_LOAD_RELATED_CLASSES истина, когда вы работаете в постоянной среде, и оставить его ложь (и не забывайте явно загружать связанные классы) для сценариев командной строки.

Опять же, это поможет только в том случае, если вы загружаете больше классов, чем строго нужно в конкретном скрипте из-за истинного значения по умолчанию атрибута метаданных auto_load_related_classes.

+0

Извините за долгую задержку в ответе ... Мне пришлось сначала выполнить реализацию, и, как это сделано сейчас, и все тестовые проходы, я возвращаюсь к оптимизации производительности. Однако, согласно вашему предложению выше, не улучшается время компиляции? И количество модулей, загружаемых в% INC, остается неизменным. В документации указано, что «auto_load_related_classes» будет автоматически загружаться, когда этот класс инициализируется, я предполагаю, что это происходит, когда я вызываю «sub init_db {My :: DB-> new()}» через My :: DB :: Object? – est

+0

Нет, это означает, что если вы загружаете класс A и у вас есть отношение к классу B, класс B будет автоматически загружаться, если auto_load_related_classes() - true. Если вы уже вручную загрузите оба класса A и B, то, очевидно, этот параметр не будет иметь никакого эффекта. –

+0

Ах, теперь это начинает иметь смысл. Я думаю, что на более быстрый диск будет путь для моего дела здесь ... – est

3

Если время компиляции является проблемой, есть способы уменьшить влияние. Один из них - PPerl, который превращает обычный скрипт Perl в демон, который компилируется один раз. Единственное изменение, которое нужно сделать (после установки, конечно) является в хижину линии:

#!/usr/bin/pperl 

Другой вариант заключается в коде написать типовую программу клиент/сервер, где основная часть работы делается на сервер, который загружает дорогие модули и тонкий скрипт, который просто взаимодействует с сервером через сокеты или каналы.

Вы также должны посмотреть App::Persistent и article, оба из которых были написаны Джонатаном Рокуэем (aka jrockway).

Смежные вопросы