Perché il polyfill della mappa JavaScript () è lento

4

In base a snippet JSPerf (e alcuni altri), l'implementazione di default map() di JavaScript è più lento del 21% rispetto all'utilizzo di for di base.

Esaminandoil polyfill ufficiale , capisco immediatamente perché map() è così lento.

Polyfill strange part

line 15: var O = Object(this);

L'oggetto iniziale viene convertito (e duplicato) in un oggetto JavaScript.

line 42: while (k < len) {

A destra, a partire da 0, itera su tutta la lunghezza dell'array, sembra legittimo!

line 52: if (k in O) {

Questo è il punto. Questo controllo è così lento e viene ripetuto per ogni operazione. L'operazione in può utilizzare una ricerca sequenziale nell'array, che è così lenta e influenza le prestazioni globali.

L'iterazione su un array da 0 a array.length non implica di controllare, ogni volta, se l'indice esiste.

Perché questo controllo è utile?

    
posta sweepy_ 13.04.2017 - 15:03
fonte

1 risposta

6

Un array è ancora un oggetto, quindi puoi eliminarlo. Ad esempio:

var x = [0,1,2,3,4];
delete x[2];
x.map(function (x) { return x + 10; });

La proprietà con la chiave "2" non è più definita. Per Array significa che c'è uno slot vuoto.

Le specifiche consentono anche di modificare la matrice su cui mappare durante la mappatura:

The range of elements processed by map is set before the first call to callbackfn . Elements which are appended to the array after the call to map begins will not be visited by callbackfn . If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time map visits them; elements that are deleted after the call to map begins and before being visited are not visited.

Anche le specifiche per la mappa terminano con il seguente commento sulla funzione map , che può offrire ulteriori spiegazioni per la logica:

The map function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the map function can be applied successfully to a host object is implementation-dependent.

    
risposta data 13.04.2017 - 15:32
fonte

Leggi altre domande sui tag