Forum Webscript.Ru
Программирование => Perl => Тема начата: puh от 14 Февраля 2002, 00:03:59
-
Вот ковыряюсь я с Perl\'ом уже не первый месяц, что-то стал наконец понимать и задался вопросом:
А от чего зависит быстродействие скрипта?
Ну, например, если я использую подключаемые модули (типа CGI или IO::Socket), или даже просто подключаю свой же файл-template тормозит ли это систему? Может лучше все в одном файле помещать?
-
perldoc Benchmark
-
perldoc Benchmark
;) оч. сомнительная помощь :D
тесты конечно хорошо, но ... не все же тестить,тестить, тестить?
Где то я книжку англ. видел "Эффективное программирование на Perl". А на русском нет :(
-
вот например, я тут тестировал на днях:
Benchmark: timing 10 iterations of FOREACH, MAP...
FOREACH: 18 wallclock secs (18.01 usr + 0.00 sys = 18.01 CPU) @ 0.56/s (n=10)
MAP: 1 wallclock secs ( 1.81 usr + 0.00 sys = 1.81 CPU) @ 5.52/s (n=10)
s/iter FOREACH MAP
FOREACH 1.80 -- -90%
MAP 0.181 895% --
Вроде бы судя по тестам конструкция с map намного предпочтительней...
А вот код:
#!/usr/bin/perl -w
use Benchmark;
#---------------------------
#Green Kakadu map vs foreach
#---------------------------
@array=();
@t=();
$array[0]=undef;
for my $i (1..10000){
push @array, $i;
}
Benchmark::cmpthese (10, {
\'FOREACH\' => sub {&classic},
\'MAP\' => sub {&map_me},
});
sub classic {
#--------------------------------------
foreach my $i (@array){
push @t, $i if defined $i;
}
undef @t;
}
sub map_me {
#--------------------------------------
map{ push @t, $_ if defined $_} @array;
undef @t;
#хотя тут стоило бы написать более корректно:
#@t=map{$_ if defined $_} @array;
}
-
оч. сомнительная помощь
:)
Был вопрос:
Ну, например, если я использую подключаемые модули (типа CGI или IO::Socket), или даже просто подключаю свой же файл-template тормозит ли это систему? Может лучше все в одном файле помещать?
Сложно проверить оба варианта, да?
:)
А вообще это достаточно большая тема и основное в ней скорее опыт программирования и знание особенностей языка.
Как правило при возрастании опыта написания программ они становяться менее ресурсоемкими, хотя на данном пути бывают и исключения.
-
вот например, я тут тестировал на днях:
Benchmark: timing 10 iterations of FOREACH, MAP...
FOREACH: 18 wallclock secs (18.01 usr + 0.00 sys = 18.01 CPU) @ 0.56/s (n=10)
MAP: 1 wallclock secs ( 1.81 usr + 0.00 sys = 1.81 CPU) @ 5.52/s (n=10)
s/iter FOREACH MAP
FOREACH 1.80 -- -90%
MAP 0.181 895% --
Вроде бы судя по тестам конструкция с map намного предпочтительней...
У меня получился совершенно обратный результат на том же скрипте:
---------- Perl Run ----------
Benchmark: timing 10 iterations of FOREACH, MAP...
FOREACH: 1 wallclock secs ( 1.21 usr + 0.00 sys = 1.21 CPU) @ 8.26/s (n=10)
MAP: 3 wallclock secs ( 2.75 usr + 0.00 sys = 2.75 CPU) @ 3.64/s (n=10)
Rate MAP FOREACH
MAP 3.64/s -- -56%
FOREACH 8.26/s 127% --
Normal Termination
Output completed (5 sec consumed).
Приходим к зависимости от ОС, версий и реализаций Перла.:))
-
Приходим к зависимости от ОС, версий и реализаций Перла.
угу у меня были такие подозрения + встречал в конференции тесты о том, что мол map проигрывает foreach
(результаты того что я привел под ActivePerl под win ;))
а под linux все действительно иначе).
причем картина прямо таки совсем противоположная :) и как тут оценить эффективность скрипта?
Пока, наиболее действенные примеры и способы я нашел в книге "Регулярные Выражения"
-
результаты того что я привел под ActivePerl под win
Аналогично.
-
Аналогично.
м-да. у меня w98 была.
А вот результаты под linux (100 итераций, foreach все равно выигрывает)
Benchmark: timing 100 iterations of FOREACH, MAP...
FOREACH: 14 wallclock secs (13.64 usr + 0.03 sys = 13.67 CPU) @ 7.32/s (n=100)
MAP: 18 wallclock secs ( 18.01 usr + 0.00 sys = 18.01 CPU) @ 5.55/s (n=100)
s/iter MAP FOREACH
MAP 5.55/s -- -24%
FOREACH 7.32/s 32% --
-
Спасибо, буду копать дальше...
[подумал он и поразился опыту и начитанности собеседников]
-
На Perl.com появилась статья: Optimizing Your Perl
http://www.perl.com/pub/a/2002/02/12/bigo.html?page=1
весьма познавательно