dicționar - Care este complexitatea accesului la Record în Typescript cunoscând cheia?


Am citit în această întrebare că Map-ul din Javascript are complexitate O(1) pentru recuperare/acces. Typescript are Records care au un avantaj: sunt tipizate. Totuși, mă întrebam dacă Records-urile din Typescript ne oferă aceeași performanță la acces. Ar trebui să folosim map-uri simple JS pentru a optimiza viteza de acces la date?

Răspuns #1

Am citit în această întrebare că Map din Javascript are complexitate O(1) pentru recuperare/acces.

Acea întrebare este specific despre implementarea Map în motorul JavaScript V8 (în 2015). Nu o poți generaliza la hărți în alte implementări, iar O(1) nu este garantat de specificație. Tot ce este garantat este că accesul va fi subliniar raportat la numărul de intrări din Map.

Typescript are Recorduri care au un avantaj: sunt tipizate. Totuși, mă întrebam dacă Recordurile din Typescript ne oferă aceeași performanță de acces.

Tipul Record din TypeScript este pur și simplu o abstracție la timpul de compilare peste un obiect JavaScript. Deci întrebarea este: Este timpul de acces pentru proprietățile unui obiect JavaScript cel puțin la fel de bun ca timpul de acces al intrărilor dintr-un Map JavaScript?

Depinde, dar în general da. De fapt, pentru obiectele cu seturi stabile de proprietăți, este probabil să fie semnificativ mai rapid în cazurile în care contează, deoarece în cazurile în care contează, motoarele moderne de JavaScript compilează obiectele în clase generate la rulare cu sloturi statice pentru proprietăți, astfel încât accesarea acelor proprietăți este o operațiune de timp constant (O(1)).

Dar, dacă conținutul obiectelor tale variază în timp (setul de proprietăți nu este relativ static), optimizările făcute pentru obiecte nu sunt potrivite și s-ar putea să fie mai bine să folosești un Map.

Rețineți că există și alte motive decât performanța pentru a alege un obiect în locul unui Map, sau un Map în locul unui obiect. De exemplu, cheile unui Map pot fi orice, dar cheile unui obiect pot fi doar șiruri de caractere sau Simboluri. Accesarea unei valori într-un Map necesită apelarea unei funcții; nu este cazul proprietăților unui obiect. Și așa mai departe.

Mai multe pe MDN.