JS map filter vs loop a performance rubrika: Programování: JavaScript

7 xxar3s
položil/-a 2.1.2017
 
upravil/-a 2.1.2017

oplati sa pri velkom pocte poloziek pouzivat funkcie Array.map a Array.filter?

robil som si test https://jsperf.com/native-map-versus-array-looping

A map je o 94% pomalsi ako for (+ array.push).

A ked je tam este kombinacia filtru a mapu tak su tam 2x pomale higher order funkcie, ktore vykonavaju dva loopy a ten sa da nahradit jednym.

Napriklad .NET ma taketo veci optimalizovane pomocou lazy evaluation (pri pouziti spravnych kolekcii), takze namiesto dvoch loopov sa vykona len jeden. Myslel som ze aj JS sa uz v tejto oblasti posunul dopredu, ale vidim ze asi najlepsie bude pouzivat stare dobre cykly.

odkaz
8 Občan
odpověděl/-a 2.1.2017

Vyplatí, v bodech:

  • Korektnost, tedy čitelnost kódu viz @Kit
  • Když už potřebuji pracovat s tak velkým polem, že to je znát tak už většinou projekt obsahuje Lodash, či podobný "Swiss Knife", který vnitřně převádí Map na výkonější smyčky. Takže je dodržen první bod. (Podle mě, častý případ.)
  • Setkal jsem se na projektech s programátory, kteří přepisovali horlivě mapy na while--, tam, kde bylo řádově desítky položek. Takový počet si dá dnešní stroj "k svačině". Tak velké pole, kde to stroj pocítí je tak vyjímečná situace, že se operativnímu řešení snad meze nekladou.
  • Lazy možný je i v Javascriptu, ač ne nativně, ale patternem.

Komentáře

  • xxar3s : Samozrejme pri desiatkach poloziek to nema zmysel - ja hovorim o filtrovani poloziek v realnom case podla zadanych filtrov pri stovkach tisic poloziek bez nejakych loadingov a podobne. Citatelnost je dolezita ale to aby aplikacia fungovala korektne a nezadrhavala sa je dolezitejsie. 2.1.2017
  • Občan : V tom případě ta nenativní verze Map implementovaná pomocí reverzního while mě příjde OK. Ale jako realtime zpracovávat stovky tisíc položek už je docela výzva. :) 2.1.2017

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.