javascript supporta gli array indicizzati numericamente con un algoritmo più ottimizzato di un array associativo?

7

So che Python, Perl, Java, Lua e ovviamente C (poiché è l'unico array che è in afaik ANSI standard) supportano l'aspetto più veloce degli array indicizzati numericamente rispetto a una ricerca hash o qualcosa del genere. Anche Javascript?

Come esempio nel codice di cosa intendo, nel caso di Perl:

for(i=0;i<10;i++)
{
  # Do something
}

è più lento di:

for (1..9)
{
  # do something else
}

o

@var = (1,2,3)
foreach(@var)
{
  print $_; # look I'm fancy
}

e più veloce di:

foreach my $key (keys %hash) 
{
  print $_; # Look I'm fancy
}

e in python, dato il seguente:

class thisClass:
  def methodOne(i):
    return i+1

thisDict = { 
  'number': 1
}

Queste due operazioni sono simili nella velocità perché entrambe implicano una ricerca hash in un hash dello stesso spessore:

thisObject = new thisClass
i  = thisObject.methodOne(1)

e

i = 1+thisDict['1'];

Entrambi questi tipi di ricerche sono più lenti di questo:

thisTuple = (1,)
i = thisTuple[0]+1

Mentre questo:

thisArray = [1,2]

for i in thisArray:
 print i

è iterato più veloce di:

thisTuple = (1,2)

for i in thisTuple:
  print i

con cui intendo elenchi iterati più velocemente delle tuple.

Javascript supporta gli array indicizzati numericamente in modo diverso rispetto agli array associati? Non credo che Javascript supporti più di array e array associativi, ma se lo fa come si confronta con i due in termini di velocità?

    
posta Nathan C. Tresch 29.01.2013 - 07:13
fonte

2 risposte

7

JavaScript non ha alcun modo esplicito per specificare che si desidera una matrice normale piuttosto che un oggetto: tutto è un oggetto per impostazione predefinita. Tuttavia, i moderni motori JavaScript hanno ottimizzazioni aggressive per oggetti che agiscono come array. ( Qui è un buona panoramica di ciò che fa V8, per esempio.)

I motori JavaScript moderni utilizzano la "compilazione just-in-time" (JIT). Ciò significa che ottimizzano il codice in base a come viene utilizzato in fase di runtime. Se il motore vede che si accede a un oggetto con indici numerici consecutivi, può ottimizzarli in una struttura a forma di array. Tuttavia, questo potrebbe richiedere del tempo per essere applicato, che dovresti tenere a mente se vuoi scrivere i tuoi benchmark.

Sfortunatamente, queste sono tutte ottimizzazioni che non fanno parte della semantica del linguaggio. Ciò significa che non puoi fare affidamento su nessuno di loro attraverso i motori. Quindi, se stai scrivendo un codice che trarrebbe vantaggio dalla semantica di tipo array, tratta i tuoi oggetti come normali array e assicurati di creare un profilo sugli interpreti di destinazione.

Inoltre, per casi d'uso molto specifici, JavaScript ha array digitati . Se si dispone di dati binari non elaborati, come una schiera di interi o float, è possibile sfruttare questi array tipizzati per archiviarli, leggerli e scriverli in modo molto più efficiente.

Sfortunatamente potresti avere alcuni problemi con supporto browser di array digitati. Sono stati aggiunti solo di recente ai browser proprietari, quindi se hai bisogno di supportare IE < 10 o Safari < 5.1, non puoi utilizzarli.

    
risposta data 29.01.2013 - 10:40
fonte
4

Questi test sembrano supportare l'idea che ci sia qualche ottimizzazione a favore degli array sulla maggior parte dei browser:

stranezze delle prestazioni della matrice Javascript

    
risposta data 29.01.2013 - 08:56
fonte

Leggi altre domande sui tag