abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 09:55 | IT novinky

    Společnost Amazon miliardáře Jeffa Bezose vypustila na oběžnou dráhu první várku družic svého projektu Kuiper, který má z vesmíru poskytovat vysokorychlostní internetové připojení po celém světě a snažit se konkurovat nyní dominantnímu Starlinku nejbohatšího muže planety Elona Muska.

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

    Poslední aktualizací začal model GPT-4o uživatelům příliš podlézat. OpenAI jej tak vrátila k předchozí verzi.

    Ladislav Hagara | Komentářů: 0
    dnes 08:11 | Nová verze

    Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 20:55 | Nová verze

    Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Nová verze

    Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 15:55 | Pozvánky

    Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových

    … více »
    Zdenek H. | Komentářů: 2
    včera 15:44 | IT novinky Ladislav Hagara | Komentářů: 2
    včera 13:55 | Komunita

    Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.

    Ladislav Hagara | Komentářů: 10
    28.4. 23:33 | Nová verze

    Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    28.4. 17:22 | Zajímavý projekt

    TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.

    Ladislav Hagara | Komentářů: 0
    Jaký filesystém primárně používáte?
     (58%)
     (1%)
     (9%)
     (21%)
     (4%)
     (1%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 486 hlasů
     Komentářů: 18, poslední 17.4. 12:41
    Rozcestník

    sub vs do performance in Perl

    5.1.2007 16:00 | Přečteno: 1068× | 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.