abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 21:00 | Komunita

    Byly zveřejněny videozáznamy, dostupné také s prezentacemi přímo z programu, a také fotogalerie z open source komunitní konference DevConf.CZ 2024 konané od 13. do 15. června v Brně.

    Ladislav Hagara | Komentářů: 0
    dnes 16:44 | Nová verze

    Nedávno představená služba Raspberry Pi Connect pro vzdálený přístup k Raspberry Pi z webového prohlížeče nově podporuje všechny Raspberry Pi a umožňuje povolit pouze vzdálený shell (Connect Lite). Detaily v dokumentaci.

    Ladislav Hagara | Komentářů: 3
    dnes 12:30 | IT novinky

    Seznam dělá každé úterý odstávku svého datacentra a simuluje tak správnost jejich HA řešení. Dnes se ovšem něco pokazilo a má kompletní výpadek. Nejdou webové služby, mapy apod. Kdo by rád věděl něco více o tom, na čem Seznam běží, tak nelze nepřipomenout LinuxDays 2023: Podvozek Seznamu - od cloudu až po Datacentrum (Michal Toužín, Miroslav Bezdička).

    Max | Komentářů: 10
    dnes 12:00 | Komunita

    Na stránkách konference Den IPv6 2024, jež proběhla 6. června v Praze, byly zveřejněny prezentace a videozáznamy.

    Ladislav Hagara | Komentářů: 0
    dnes 11:11 | IT novinky

    Kyberkriminální skupina LockBit se prý nabourala do Federálního rezervního systému (FED) [Security Affairs].

    Ladislav Hagara | Komentářů: 1
    dnes 04:55 | IT novinky

    Zakladatel WikiLeaks Julian Assange je na svobodě (𝕏, 𝕏).

    Ladislav Hagara | Komentářů: 2
    včera 13:11 | Upozornění

    V neděli 30. června skončí (EOL) podpora CentOS Linux 7.

    Ladislav Hagara | Komentářů: 11
    včera 10:44 | Zajímavý článek

    David Tschumperlé a Garry Osgood v obšírném článku se spoustou náhledů shrnují vývoj multiplatformního svobodného frameworku pro zpracování obrazu G'MIC (GREYC's Magic for Image Computing, Wikipedie) za poslední rok.

    Ladislav Hagara | Komentářů: 2
    23.6. 13:22 | IT novinky

    Andrew S. Tanenbaum byl oceněn 2023 ACM Software System Award (Wikipedie) za operační systém MINIX.

    Ladislav Hagara | Komentářů: 2
    23.6. 10:22 | Komunita

    Celkový počet stažení aplikací z Flathubu překročil 2 miliardy. Aktuální Statistiky Flathubu: Celkový počet stažení 2 002 793 783. Celkem desktopových aplikací 2 636.

    Ladislav Hagara | Komentářů: 21
    Rozcestník

    sub vs do performance in Perl

    5.1.2007 16:00 | Přečteno: 1050× | Perl | poslední úprava: 5.1.2007 16:34

    Tak jsem uvnitř podmínky grepu potřeboval vyhodnotit nějakou složitější věc a měl jsem možnost napsat to jako annonymní sub a nebo do. Položil jsem si otázku co bude rychlejší?

    Vnitřek podmínky grepu vypadal nějak podobně takhle:

    do
    my $attr = $_;
    my $successors = $successors{$attr};
    $successors
    and do {
      my $res;
      $res = exists $successors->{$_} and last
        foreach (predecessors($attr));
      !$res
    }
    
    sub
    my $attr = $_;
    my $successors = $successors{$attr};
    $successors
    and sub {
      exists $successors->{$_} && return 0
        foreach predecessors($attr);
      1
    }->()
    

    Výsledný kód jsem trošku benchmarkoval a verze se sub je až o 50% pomalejší (samozřejmě v závislosti na okolní režiji). Ale proč? Odpověď je celkem jednoduchá, annonymní subrutina se pokaždé znovu skompiluje. (Trošku zjednodušuji, ona se ve skutečnosti jednou předkompiluje a pak se jí mění syntaktický kontext, ale ve výsledku je pro každé zavolání vnitřní smyčky vytvořená nová subrutina. Kdybych si ji někam ukládal tak bude pokaždé na jiné adrese, atd.) Dá se tomu nějak zabránit? Jistě, vytvořit immutable annonymní subrutinu a Perl je tak chytrý, že ji skompiluje jen jednou.

    immutable sub
    my $attr = $_;
    my $successors = $successors{$attr};
    $successors
    and sub {
      exists $_[0]->{$_} && return 0
        foreach predecessors($_[1]);
      1
    }->($successors, $attr)
    

    Takový kód je pak prakticky stejně rychlý jako do. Co je na tom zajímavého? Snad jen to, že do v perlu se tak hezky chová, skompiluje se jen jednou i když obsahuje proměnné v syntaktickém kontextu a je tedy rychlejší než použití annonymního sub.

    Pokud si chcete taky pohrát, tak zde je text kompletního benchmarku:

    #!/usr/bin/env perl
    
    use strict;
    use Benchmark qw(:all :hireswallclock);
    
    my $count = 100;
    
    my %successors = map +($_, {$_ => undef}), 1..$count;
    sub predecessors {($_[0]-1) .. ($_[0]+1)}
    sub none (&@) {
    	&{$_[0]} && return 0 foreach @_[1..$#_];
    	1
    }
    
    cmpthese(-2, {
    	'do' => sub {
    			do {my $attr = $_;
    				my $successors = $successors{$attr};
    				do {
    					my $res;
    					foreach (predecessors($attr)) {
    						$res = exists $successors->{$_} and last
    					}
    					!$res
    				}
    			} foreach 1 .. $count;
    		},
    	'sub' => sub {
    			do {my $attr = $_;
    				my $successors = $successors{$attr};
    				sub {
    					exists $successors->{$_} && return 0
    						foreach predecessors($attr);
    					1
    				}->()
    			} foreach 1 .. $count;
    		},
    	'subimmu' => sub {
    			do {my $attr = $_;
    				my $successors = $successors{$attr};
    				sub {
    					exists $_[0]->{$_} && return 0
    						foreach predecessors($_[1]);
    					1
    				}->($successors, $attr)
    			} foreach 1 .. $count;
    		},
    	'none' => sub {
    			do {
    				my $successors = $successors{$_};
    				none {$successors->{$_}} predecessors($_);
    			} foreach 1 .. $count;
    		},
    	'evalblock' => sub {
    			do {my $attr = $_;
    				my $successors = $successors{$attr};
    				eval {
    					my $res;
    					foreach (predecessors($attr)) {
    						$res = exists $successors->{$_} and last
    					}
    					!$res
    				}
    			} foreach 1 .. $count;
    		},
    	'evalstr' => sub {
    			do {my $attr = $_;
    				my $successors = $successors{$attr};
    				eval '
    					my $res;
    					foreach (predecessors($attr)) {
    						$res = exists $successors->{$_} and last
    					}
    					!$res
    				'
    			} foreach 1 .. $count;
    		},
    	});
    

    Pro zajímavost jsou doplněny ještě další varianty. Není překvapením, že blokové použití evalu je stejně rychlé jako do nebo immutable sub. Trochu jsem byl zklamán rychlostí při použití krásné elegantní šablonované funkce none. Tam se vlastně stejně jako při normálním annonymním sub pokaždé znovu skompiluje první parametr a jestě ke všemu se tato subrutina volá uvnitř foreach, takže to ve výsledku dopadne hůř. No a nejhorší je eval stringu, nic divného, že ;-)

    P.S.: Nakonec jsem se do úplně vyhnul a použil jednu z vlastností if, že vrací hodnotu podmínky. No co, aspoň jsem nahlédl do chování perlu zase o kousek hloub. Ekvivalent shora uvedených kódů pak nakonec vypadá asi takhle:

    if (my $successors = $successors{$_}){
      my $res;
      $res = exists $successors->{$_} and last
        foreach (predecessors($_));
      !$res
    }

    Ano, to je celý vnitřek podmínky grepu, ušetřím ještě jednu alokaci proměnné, což je podle mých měření dokonce víc než zavolání sub

           

    Hodnocení: 88 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    5.1.2007 16:31 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: sub vs do performance in Perl
    do nerobí to isté, čo sub. Ako píšu v dokumentácií, Not really a function..

    do jednoducho vyhodnotí blok.
    sub vytvorí anonymnú funkciu, ktorej kopíruje kontext (pre ostatných, google: perl closures)

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.