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í
×

    včera 13:44 | IT novinky

    Největší kryptoměnová burza světa Binance se stala terčem útoku, při kterém podvodníci odcizili během několika minut kryptoměny v hodnotě přibližně 6,3 miliardy dolarů. Jedná se o největší kryptoměnovou krádež v historii, přibližně čtyřikrát větší než loňský útok na burzu Bybit. Binance se podařilo ve spolupráci s partnery zmrazit aspoň aktiva v hodnotě zhruba 3 miliard dolarů a slíbila, že veškeré ztráty pokryje z vlastních prostředků.

    Ladislav Hagara | Komentářů: 10
    včera 02:16 | Bezpečnostní upozornění

    Zranitelnost CVE-2026-98432 s CVSS 9.8 odhalila AI od společnosti Anthropic. Jedná se o kritickou chybu v implementaci MPTCP (multipath TCP). Debian vydal patche 16.10. a 22.10., ale např. Ubuntu je zatím bez opravy. Více informací na The Hacker News.

    Max | Komentářů: 20
    29.10. 23:22 | Zajímavý software

    Na Slovensku vznikla úplne nová rally hra, ktorá je zadarmo a funguje vo Windowse, Linuxe či na Macu. Greenie Rally má viac ako 50 tratí a vozidiel, šampionáty či turnaje. Má retro feeling a imituje automobilové hry z prelomu tisícročí. Vyskúšate prejsť všetky mapy na Škode 130RS?

    Stanislav Hoferek | Komentářů: 5
    29.10. 14:33 | Komunita

    Do základního systému NetBSD -current byl přidán nový editor atto jako alternativa k editorům vi a xedit.

    Ladislav Hagara | Komentářů: 1
    29.10. 14:11 | IT novinky

    Společnost System76 představila kompaktní 11litrový Thelio Prime Desktop. S procesorem AMD Ryzen 9000. S Pop!_OS 24.04 LTS s desktopovým prostředím COSMIC nebo Ubuntu 24.04 LTS.

    Ladislav Hagara | Komentářů: 0
    29.10. 13:44 | Humor

    Čínská státní televize pozastavila vysílání španělské La Ligy a čínské internetové platformy omezily obsah s Kylianem Mbappém poté, co slavný fotbalista ve francouzském pořadu The Bridge mluvil o svém oblíbeném memu, v němž je jeho tvář vložena do portrétu zobrazujícího diktátora Mao Ce-tunga. 'Můj oblíbený mem je ten, na kterém dali můj obličej na čínského diktátora. To mě opravdu rozesmívá. S přáteli ho používám pořád' řekl,

    … více »
    Pendrekama do nich❗ | Komentářů: 12
    29.10. 13:22 | IT novinky

    Při příležitosti oslav Dne vzniku samostatného československého státu (28. října) byly uděleny medaile Za zásluhy tvůrci aplikace Záchranka Filipu Maleňákovi, vědci v oblasti umělé inteligence Tomáši Mikolovovi a Olze Štěpánkové, vědkyni zabývající se kybernetikou, robotikou a strojovým učením, průkopnici v oblastech výuky a využití umělé inteligence v medicínském inženýrství.

    Pendrekama do nich❗ | Komentářů: 8
    29.10. 01:33 | IT novinky

    Apple představil nový iPad mini, iMac s čipem M6, 14palcový MacBook Pro s čipem M6 a MacBook Pro s PROLED XDR displejem – první Mac s dotykovým ovládáním.

    Ladislav Hagara | Komentářů: 5
    28.10. 23:22 | Zajímavý projekt

    Nedávno představený projekt mapSTL.com řeší budoucnost. 𝕏: "Netušil jsem, kolik patentů na generování map existuje. Existují patenty na generování fantasy map 🫣. Cokoliv je na 3D tiskárnu a tvoří to produkt, bude to mít patenty. Tak bacha na to!" … více »

    Ladislav Hagara | Komentářů: 5
    28.10. 18:55 | Nová verze

    Multiplatformní emulátor terminálu Ghostty byl vydán ve verzi 1.4 (𝕏). Přehled novinek a vylepšení v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (20%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2952 hlasů
     Komentářů: 34, poslední 26.10. 08:24
    Rozcestník

    sub vs do performance in Perl

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