> 呵呵,其实 runtime 的开销在大多数情况下比较有价值,另外,你代码中有个地方有问题,可能是你最近改的时候出的问题,你第一版给我的时候我没发现
> ------
>
> my $accessor_code = q!unuse(qr/^Class\//);*eval {*package FooC;use base
> "Class::Accessor";__PACKAGE__->mk_accessors(qw/x y/);}!;
>
> ------
> 注意这儿的红色 *eval {* , 应该改成 *eval q{* , 不然的话,和其他 code 比就不公平了
Oh, nice catch :) vim 撤消失误,哈哈!现在当 $ENABLE_UNUSE 为 0 时的结果是:
Rate Moose Class::XSAccessor Class::Accessor
Class::Accessor::Fast
Moose 197/s -- -95% -97%
-97%
Class::XSAccessor 3704/s 1780% -- -41%
-46%
Class::Accessor 6250/s 3073% 69% --
-8%
Class::Accessor::Fast 6818/s 3361% 84% 9%
--
为 1 时的结果是:
Rate Moose Class::XSAccessor
Class::Accessor::Fast Class::Accessor
Moose 37.9/s -- -91%
-99% -99%
Class::XSAccessor 401/s 958% --
-91% -91%
Class::Accessor::Fast 4225/s 11048% 954%
-- -3%
Class::Accessor 4348/s 11371% 984%
3% --
> eval {} 后面是block, 只在 runtime 解析一次,而 eval q{} 后面这个 expr 每次都解析,直接导致了
> $accessor_code 测试结果更快更好。
>
*nod*
> 另外,你贴的结果中:
> ------
>
> Class::Accessor 50000/s 27233% 1917%
> 450% --
>
> ----
> 应该是有些问题,可能是你运行测试脚本的时候,$accessor_code 的 eval 中存在某个语法错误导致测试结果如上所示。
哈哈!TNT 真细心,多谢多谢!我确实应该把里面的 eval 的结果抛出来 :) 结果我发现了 Moose 在 ENABLE_UNUSE 时会抛异常:
This method cannot be called on an immutable instance at
/usr/local/lib/perl/5.10.0/Class/MOP/Class/Immutable/Trait.pm line 29
Class::MOP::Class::Immutable::Trait::_immutable_cannot_call('Class::MOP::Class::Immutable::Class::MOP::Class=HASH(0xa0db658)')
called at /usr/local/lib/perl/5.10.0/Class/MOP/Class/Immutable/Trait.pm
line 35
重构后的 bench 脚本是:
http://agentzh.org/misc/accessor_bench2.pl
我确实不该偷懒 :P
ENABLE_UNUSE 置为 0 时使用 accessor_bench2.pl 的输出为:
Rate Moose Class::Accessor::Fast
Class::Accessor Class::XSAccessor
Moose 236/s -- -94%
-95% -97%
Class::Accessor::Fast 4286/s 1717% --
-4% -44%
Class::Accessor 4478/s 1799% 4%
-- -42%
Class::XSAccessor 7692/s 3162% 79%
72% --
确实是原本期望的顺序了 :) Class::Accessor 和 Class::Accessor::Fast
在这里应该没有什么区别,毕竟后者只是覆盖了前者的 make_accessor 方法 :)
教训:把 benchmark 做对确实还是需要细心细心再细心 :)
Thanks!
-agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---
没有评论:
发表评论