![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
Funkce | Popis |
timeit | změří dobu provádění kódu |
timethis | spustí několikkrát úsek kódu a změří dobu provádění |
timethese | spustí několikkrát několik úseků kódu a změří doby provádění |
countit | změří, kolikkrát proběhl úsek kódu ve specifikovaném čase |
cmpthese | tiskne výsledky porovnání několika úseků kódu v tabulce (touto funkcí již jsme se zabývali při měření rychlostí regulárních výrazů) |
Nejjednodušší funkcí ze všech je timeit. Na základě počtu opakování a kódu provede výkonostní test a vrátí objekt typu Benchmark. Tedy v podstatě to, co jsme dělali v obou příkladech.
Kód je třeba uvést tak, jako kdyby měl být předán funkci eval. Musíme zabránit, aby byl vyhodnocen dříve, než bude předán funkci timeit, neboť by tak byl celý test znehodnocen. Použijeme tedy apostrofy.
$i=0;
my $o = timeit(1_000_000, '$pole[$i] = $i**2; $i++');
print timestr($o);
Můžeme si ukázat, jak vypadá výstup po volání timeit. Nejcennějším údajem bude většinou údaj počet_běhů/s.
4 wallclock secs ( 4.37 usr + 0.19 sys = 4.56 CPU) @ 1096491.23/s (n=5000000)
Podobně funguje také další funkce, timethis. Nejzřetelnější rozdíly oproti timeit jsou v tom, že timethis výsledky přímo tiskne a že lze zadat místo počtu cyklů záporné číslo. To znamená čas násobený -1, po který bude testování běžet.
my $i=0;
timethis(5_000_000, '$pole[$i] = $i**2; $i++');
Doba běhu části kódu je ale v podstatě nicneříkající. Smysl dostává až tehdy, když ji vztáhneme k nějakému srovnatelnému údaji. Proto ve většině případů oceníme spíše funkce k porovnávání. Jednou z nich je funkce timethese, která použije timethis na několik různých úseků.
Další funkcí na porovnávání více úseků je cmpthese, kterou jsme siž představili v 25. dílu.
Zkusíme si porovnat rychlosti následujících dvou podprogramů.
sub bubblesort {
my @a = @_;
foreach $i (reverse 0..$#a) {
foreach (0..$i-1) {
($a[$_],$a[$_+1]) = ($a[$_+1],$a[$_]) if ($a[$_] > $a[$_+1]);
}
}
return @a;
}
sub quicksort {
@_ or return();
my $p = shift;
return (quicksort(grep $_ < $p, @_), $p, quicksort(grep $_ >= $p, @_));
}
Vygenerujeme tedy náhodnou posloupnost čísel a ty se potom pokusíme seřadit.
my @cisla;
for(my $i=0; $i<100; $i++){
$cisla[$i] = int rand 100;
}
Pokud chceme zobrazit co nejvíce získaných dat, je výhodné použít cmpthese i timethese najednou.
use Benchmark qw(cmpthese timethese);
$o = timethese(-5, {
"bubble sort" => sub{bubblesort(@cisla)},
"quick sort" => sub{quicksort(@cisla)},
"perl sort" => sub{sort {$a<=>$b} @cisla;},
});
cmpthese($o);
Nyní spustíme program. Výsledek by měl vypadat přibližně takto. Nelze sice objektivně srovnávat výsledky vestavěného příkazu sort s výše uvedenými podprogramy, ale výsledek je jistě zajímavý.
Benchmark: running bubble sort, perl sort, quick sort for at least 5 CPU seconds...
bubble sort: 5 wallclock secs ( 5.21 usr + 0.01 sys = 5.22 CPU) @ 166.86/s (n=871)
perl sort: 4 wallclock secs ( 5.45 usr + 0.00 sys = 5.45 CPU) @ 3065623.49/s (n=16707648)
quick sort: 6 wallclock secs ( 5.32 usr + 0.00 sys = 5.32 CPU) @ 2454.14/s (n=13056)
Rate bubble sort quick sort perl sort
bubble sort 167/s -- -93% -100%
quick sort 2454/s 1371% -- -100%
perl sort 3065623/s 1837162% 124817% --
|
||
KOMENTARZE
Nie ma komentarzy dla tej pozycji. |
||
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
1. |
Pacman linux Download: 5096x |
2. |
FreeBSD Download: 9311x |
3. |
PCLinuxOS-2010 Download: 8800x |
4. |
alcolix Download: 11190x |
5. |
Onebase Linux Download: 9910x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6459x |
1. |
xinetd Download: 2623x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5247x |
4. |
LinPacker Download: 10393x |
5. |
VFU File Manager Download: 3396x |
6. |
LeftHand Mała Księgowość Download: 7484x |
7. |
MISU pyFotoResize Download: 3090x |
8. |
Lefthand CRM Download: 3760x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3373x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |