[Moscow.pm] Скорость работы структур.
Alexander Alekseev
alex на alemate.ru
Чт Фев 14 05:47:09 PST 2008
Hello!
Господа, а это нормально, или я чего-то не понимаю:
$uname -a
Linux localhost 2.6.22.12-desktop-1mdv #1 SMP Tue Nov 20 08:38:27 EST 2007 i686 AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ GNU/Linux
$perl --version
This is perl, v5.8.8 built for i386-linux
(with 1 registered patch, see perl -V for more detail)
..
1) берём скрипт:
--------------------------- Cut ----------------------------
use Benchmark;
$count = 5000000;
package tt;
sub new($){
my $class=shift;
my $self=[];
bless $self,$class;
return $self;
}
sub mmm($) : lvalue{
shift->[0];
}
sub kkk($) {
return shift->[0];
}
package main;
timethese($count, {
'new' => sub { my $a=tt->new(); return $a; },
'arr' => sub { my $a=[]; return $a; }
});
my $A=tt->new();
my $B=[];
sub LLL($){
return shift->[0];
}
$count=10000000;
timethese($count, {
'object_access_lvalue' => sub { return $A->mmm(); },
'object_access_copy' => sub { return $A->kkk(); },
'array ref access' => sub { return $B->[0]; },
'array func access' => sub { return LLL($B); }
});
------------------------------------------------------------
2) Запускаем:
$perl tt.pl
Benchmark: timing 5000000 iterations of arr, new...
arr: 3 wallclock secs ( 3.14 usr + -0.01 sys = 3.13 CPU) @ 1597444.09/s (n=5000000)
new: 11 wallclock secs (12.14 usr + 0.02 sys = 12.16 CPU) @ 411184.21/s (n=5000000)
Benchmark: timing 10000000 iterations of array func access, array ref access, object_access_copy, object_access_lvalue...
array func access: 7 wallclock secs ( 7.72 usr + 0.00 sys = 7.72 CPU) @ 1295336.79/s (n=10000000)
array ref access: 1 wallclock secs ( 1.68 usr + 0.02 sys = 1.70 CPU) @ 5882352.94/s (n=10000000)
object_access_copy: 9 wallclock secs ( 8.32 usr + 0.01 sys = 8.33 CPU) @ 1200480.19/s (n=10000000)
object_access_lvalue: 8 wallclock secs ( 8.33 usr + 0.03 sys = 8.36 CPU) @ 1196172.25/s (n=10000000)
Собственно, так и должно быть? Больше всего смущает разница между LLL($B); и $B->[0];
Это я тут переписал один скриптик от конструкций $data->{$param1}[$param2][$param3]{$param4}...
к $object->access(...), так скорость в 7 раз и упала. Получается, что даже если просто писать функкции
доступа к данным (бог с ними, с объектами), то скорость всё равно падает катастрофически?
Переходим на компиляцию каких-нибудь макросов в перловый код, раз уж сам перл оптимизировать не умеет?
Bye. Alex.
Подробная информация о списке рассылки Moscow-pm