我的Rose :: DB :: Object编译时间太慢了吗?

est*_*est 0 perl

我打算从Class :: DBI转移到Rose :: DB :: Object,因为它的结构很好,而且与CDBI和DBIC相比,RDBO的速度更快.

但是在我的机器上(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

这有很多不同......

有人在这里遇到类似的行为

干杯.


@manni和@john:感谢有关RDBO引用的模块的解释,它肯定能解释为什么编译时比CDBI慢.

应用程序未在持久环境中运行.事实上,它是由几个同时运行2分钟,5分钟和x分钟间隔的cron作业调用的 - 所以是的,编译时间在这里至关重要......

Jonathan Rockway的App :: Persistent似乎很有趣,但是它(当前)限制只允许一次运行一个应用程序并不适合我的目的.当我们杀死客户端时,它也有问题,服务器进程仍在运行...

Joh*_*usa 5

Rose :: DB :: Object只包含(或来自其他模块的引用)比Class :: DBI更多的代码.从好的方面来说,它还具有更多功能,并且在运行时比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);
}
Run Code Online (Sandbox Code Playgroud)

以下是它与公共对象基类的关联:

package My::DB::Object;

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

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

sub meta_class { 'My::DB::Object::Metadata' }
Run Code Online (Sandbox Code Playgroud)

然后RDBO_AUTO_LOAD_RELATED_CLASSES在持久环境中运行时设置为true,并将命令行脚本保留为false(并且不要忘记显式加载相关类).

同样,这只会在您当前正在加载比特定脚本中严格需要的类更多时才会有所帮助,因为auto_load_related_classesMetadata属性的默认值为true .