Komentáře k článku

Do hlubin implementací JavaScriptu: 3. díl – výkonnostně nepříjemné konstrukce

V dnešním dílu seriálu zakončíme obecné povídání o rychlosti interpretace JavaScriptu. Podíváme se na funkci eval, dále na to, jak výkonnostně nepříjemná může být možnost zjistit informace o parametrech funkcí na zásobníku a také na příkaz with. Na závěr si stručně povíme, jak jsou interprety obvykle implementované.

Zpět na článek

19 komentářů k článku Do hlubin implementací JavaScriptu: 3. díl – výkonnostně nepříjemné konstrukce:

  1. Ded Kenedy

    RE: Do hlubin implementací JavaScriptu: 3. díl - výkonnostně nepříjemné konstrukce

    V tom případě se někdy dokonce dá zapomenout jeho jméno a hledání podle názvu převést na indexování, což je významné urychlení.

    mate to nejak overene, nebo to je jen domenka?

    v pripade, ze jednotlive identifikatory jsou sdilene (coz je vcelku trivialni optimalizace), pak rozdil mezi pouzitim indexu a prohledavanim tabulky lokalnich promennych je radove v jednotkach instrukci daneho stroje, coz pro vetsinu rozumnych programu funkce ma (< 10 promennych/parametru) predstavuje zrychleni na urovni statisticke odchylky (+ samozrejme neco sezere jeste staticka analyza)

    1. David MajdaAutor příspěvku

      RE: Do hlubin implementací JavaScriptu: 3. díl - výkonnostně nepříjemné konstrukce
      Ověřené to nemám, své tvrzení jsem asi měl formulovat trochu opatrněji.

      1. c0stra

        RE: Do hlubin implementací JavaScriptu: 3. díl - výkonnostně nepříjemné konstrukce
        Stalo by za to ujasnit, co znamena podle vas v JS lokalni promenna, globalni promenna a parametr. Vse se sice zda trivialni, ale co treba rozebrat takovy priklad:

        function base(a)
        {
        var b = 4;

        return function sum()
        {
        return a + b;
        }
        }

        var a = 3;

        a = sum();

        var sum = base(4);

        a = sum();

        1. David MajdaAutor příspěvku

          RE: Do hlubin implementací JavaScriptu: 3. díl - výkonnostně nepříjemné konstrukce

          V článku popisuju konrétní situaci v toplevel funkci, tam ten identifikátor může skutečně být jen globální (= toplevel) proměnná nebo lokální proměnná či parametr (technicky je to totéž).

          Ve složitější situaci je samozřejmě třeba uvažovat celý lexikální scope chain. Jako lokální proměnnou bych pak definoval proměnnou zaznamenanou v posledním článku aktuálního scope chain, jako globální proměnnou proměnnou zaznamenanou v článku prvním. Jestli existuje nějaký používaný pojem i pro proměnné definované v ostatních článcích, netuším.

          K příkladu: V ECMA-262, 3. edice, sekce 13 se píše, že funkční výraz (to, co vracíte ve funkci base) nezapisuje název funkce jako identifikátor do aktuální tabulky proměnných (do posledního článku scope chain) a už vůbec ne do tabulky globálních proměnných (do prvního článku scope chain), a nelze se na něj tedy odvolávat v toplevelu. První příkaz a = sum(); tedy vyhodí chybu.

          Pokud bychom ho odstranili, tak na posledním řádku bude mít globální proměnná sum hodnotu funkce vracené v base, která bude mít díky uzávěrové vlastnosti poznamenán schope chain, kde a byla proměnná v jeho předposledním článku (tj. ani globální, ani lokální proměnná dle mé definice) a měla hodnotu 4. Po zavolání druhého příkazu a = sum(); bude tedy hodnota a rovna 8.

          Doufám, že vás to přesvědčilo, že vím, o čem mluvím :-)

          1. Anonym

            RE: Do hlubin implementací JavaScriptu: 3. díl - výkonnostně nepříjemné konstrukce
            No je možné z funkcie vrátiť vnorenú funkciu ako objekt.
            Nižšie som dal príklad (22.2).
            Môžete posúdiť, ako by to bolo vtedy s optimalizáciami?

    1. beer

      Re: caller
      Pokud zpracovavam JSON data prichazejici pres AJAX, tak me, vzhledem k odezve serveru, zpomaleni evalem moc nezajima :) Ale jinak se mu vyhybam, znecitelnuje kod a tim je i zdrojem chyb (spousteny kod v promenne? mfg).

      1. Anonym

        Re: caller
        A nejblbější je, že Opera na obě varianty hází bobek jako jediná. Takže kdo chce psát objektově s dedičností v JS tak to musí šíleně obcházet. Kdyby to radši uzákonili v nějaký normě bylo by vše mnohem jednodušší.

          1. Michal Aichinger

            Re: caller
            Pokud chceme implementovat funkci volani metody predka rekurzivne (avsak stale v kontextu nejake konkretni instance), je nutne "kamsi" ukladat referenci na tridu, jejiz metodu prave volame (to proto, aby bylo mozne pri dalsim volani predka "postoupit vyse" k predchozi tride). Vhodne misto k tomuto je napr. staticka vlatnost volane metody. Abychom se z teoreticky funkce "callSuperMethod" dostali k teto vlastnosti, potrebujeme mit prave arguments.caller (tj. referenci na funckci, ze ktere jsme volani). Pripadnou diskuzi na toto tema doporucuji presunout do urovne e-mailove korespondence s priklady, protoze v teto diskuzi je obtizno pokracovat bez konkretnich ukazek.

  2. BoodOk

    Eval a alternativy
    Jaké jsou tedy možnosti jak eval obejít? Možná by nebylo od věci pár typických příkladů rozebrat, protože ono se té funkce občas zbavuje velmi obtížně (samozřejmě je to často i o pohodlnosti).

    1. dan

      Re: Eval a alternativy
      jeden priklad pro vyse zmineny JSON:

      zle:
      v = eval(jsonsrc)

      dobre:
      <script type="text/javascript">
      v = jsonsrc
      </script>

      (jde to nahradit v iframe "ajaxu", pro xmlhttprequest uz to nepujde)
      (taky to jde pouzit pro "boot" volby, konfigurace a pod.. generovane serverem pri startu aplikace)

    2. karf

      Re: Eval a alternativy
      Tak pro parsování JSON by se eval stejně neměl používat – raději JSON parser, ale to hlavně z bezpečnostních důvodů (eval je v tomto případě rychlejší). Jinak já bych odpověděl protiotázkou – k čemu eval vůbec potřebujete? Já jsem jej snad nikdy seoriózně nepoužil.

  3. alblaho

    Díky
    Já chci jen poděkovat za dobrý článek. Od té doby, co root tak nějak zmainstreamovatěl už tam vývojářské věci nikdo moc nepublikuje. Proto díky za sekci zdroják a za zajímavé povídání o javascriptu.

  4. Anonym

    Je v tomto výkonovo nejaký rozdiel?
    var id1 = function(){var n = 0; return function(){return n++;};}();
    with({n:0}) var id2 = function(){return n++;};
    // Je výkonovo nejaký rozdiel medzi id1 a id2, prípadne čo sa týka optimalizácií?

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://zdrojak.cz/?p=2865