Forum Webscript.Ru

Программирование => Perl => Тема начата: puh от 14 Февраля 2002, 00:03:59

Название: Быстродействие и эффективность скрипта
Отправлено: puh от 14 Февраля 2002, 00:03:59
Вот ковыряюсь я с Perl\'ом уже не первый месяц, что-то стал наконец понимать и задался вопросом:
А от чего зависит быстродействие скрипта?
Ну, например, если я использую подключаемые модули (типа CGI или IO::Socket), или даже просто подключаю свой же файл-template тормозит ли это систему? Может лучше все в одном файле помещать?
Название: Быстродействие и эффективность скрипта
Отправлено: Chs от 14 Февраля 2002, 09:21:27
perldoc Benchmark
Название: хы
Отправлено: Green Kakadu от 15 Февраля 2002, 14:50:50
Цитировать
perldoc Benchmark

;) оч. сомнительная помощь :D
тесты конечно хорошо, но ... не все же тестить,тестить, тестить?

Где то я книжку англ. видел "Эффективное программирование на Perl". А на русском нет :(
Название: пример
Отправлено: Green Kakadu от 15 Февраля 2002, 14:55:34
вот например, я тут тестировал на днях:

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;
}
Название: Быстродействие и эффективность скрипта
Отправлено: Chs от 15 Февраля 2002, 15:58:22
Цитировать
оч. сомнительная помощь

:)
Был вопрос:
Цитировать
Ну, например, если я использую подключаемые модули (типа CGI или IO::Socket), или даже просто подключаю свой же файл-template тормозит ли это систему? Может лучше все в одном файле помещать?

Сложно проверить оба варианта, да?
:)
А вообще это достаточно большая тема и основное в ней скорее опыт программирования и знание особенностей языка.
Как правило при возрастании опыта написания программ они становяться менее ресурсоемкими, хотя на данном пути бывают и исключения.
Название: Быстродействие и эффективность скрипта
Отправлено: Chs от 15 Февраля 2002, 16:07:27
Цитировать

вот например, я тут тестировал на днях:

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).

Приходим к зависимости от ОС, версий и реализаций Перла.:))
Название: угу
Отправлено: Green Kakadu от 15 Февраля 2002, 17:14:46
Цитировать
Приходим к зависимости от ОС, версий и реализаций Перла.

угу у меня были такие подозрения + встречал в конференции тесты о том, что мол map проигрывает foreach
(результаты того что я привел под ActivePerl под win ;))
а под linux все действительно иначе).

причем картина прямо таки совсем противоположная :) и как тут оценить эффективность скрипта?

Пока, наиболее действенные примеры и способы я нашел в книге "Регулярные Выражения"
Название: Быстродействие и эффективность скрипта
Отправлено: Chs от 15 Февраля 2002, 17:58:14
Цитировать

результаты того что я привел под ActivePerl под win

Аналогично.
Название: ого
Отправлено: Green Kakadu от 15 Февраля 2002, 18:12:39
Цитировать
Аналогично.

м-да. у меня 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%      --
Название: Быстродействие и эффективность скрипта
Отправлено: puh от 15 Февраля 2002, 18:22:20
Спасибо, буду копать дальше...
[подумал он и поразился опыту и начитанности собеседников]
Название: Во, почти к теме
Отправлено: Green Kakadu от 16 Февраля 2002, 02:23:22
На Perl.com появилась статья: Optimizing Your Perl
http://www.perl.com/pub/a/2002/02/12/bigo.html?page=1
весьма познавательно