2011-10-19 14 views
52

Ricevo alcuni problemi di overflow dello stack JavaScript sul lato specifico del browser IE, questo accade all'interno di una libreria di terze parti che effettua alcune chiamate di funzione e per qualche motivo occasionalmente frenano in IE solo a causa di è basso limite di stack.Browser Javascript Limite di dimensioni dello stack

Ho quindi codificato un piccolo test HTML per verificare il limite di dimensioni dello stack per alcuni browser e ho rilevato che IE8 ha effettivamente un limite di stack piccolo rispetto a FF 7 o Chrome 14 in esecuzione su un laptop con sistema operativo Windows 7, 8 GB di RAM:

<html> 
<body> 

<!-- begin Script: --> 
<script type="text/javascript"> 

function doSomething(){ 

    var i = 3200; 
    doSomethingElse(i); 

} 

function doSomethingElse(i){ 
    if (i == 0) return -1; 
    doSomethingElse(i-1); 
} 

doSomething(); 

</script> 
<!-- END OF PAGE --> 

</body> 
</html> 

IE solleva overflow dello stack quando i valori sono circa 3200, Firefox e Chrome in grado di gestire una ricorsione molto profonda rispetto a IE.

Mi piacerebbe sapere se c'è un modo per legare l'eccezione di overflow dello stack con la funzione Javascript che lo ha generato durante il runtime in IE o in qualsiasi altro browser e se poteva dare allo stacktrace la catena di funzioni nello stack al momento l'errore è stato sollevato.

+0

È una domanda? – BNL

+2

3200 chiamate sono un sacco di spazio di stack. I programmatori Python (beh, quelli che non sono decisi a scrivere parser di discendenza ricorsiva o che sostituiscono loop perfettamente semplici con ricorsione per il resto) vanno d'accordo con un limite di 1000 chiamate. Cosa fai? – delnan

+3

Non è formulato in modo interrogativo, ma l'ultima frase "Mi chiedo se c'è ..." potrebbe essere iniziata con "Ci sono" e si è conclusa con un punto interrogativo, dando una domanda abbastanza diretta. – jball

risposta

91

Utilizzando a simple test:

var i=0; 
function inc() { 
    i++; 
    inc(); 
} 
inc(); 

Internet Explorer

  • IE6: 1130
  • IE7: 2553
  • IE8: 1475
  • IE9: 20678
  • IE10: 20677

Mozilla Firefox

  • 3,6: 3000
  • 4,0: 9015
  • 5,0: 9015
  • 6,0: 9015
  • 7.0: 65533
  • 8b3: 63485
  • 17: 50762
  • 18: 52596
  • 19: 52458
  • 42: 281810

Google Chrome

  • 14: 26177
  • 15: 26168
  • 16: 26166
  • 25: 25090
  • 47: 20878
  • 51: 41753

Safari

  • 4: 52426
  • 5: 65534
  • 9: 63444

Opera

  • 10,10: 9999
  • 10.62: 32631
  • 11: 32631
  • 12: 32631

Per quanto riguarda la tua domanda, utilizzare lo sviluppatore del browser strumenti per vedere la pila. In IE 8+, premere F12, andare alla scheda Script e fare clic su Avvia debug. Si interromperà quando viene lanciata un'eccezione e puoi vedere lo stack delle chiamate. Puoi anche utilizzare gli strumenti di sviluppo di Chrome, Ctrl + Shift + J.

+6

Puoi usare anche F12 per Chrome –

+1

Con test http://jsfiddle.net/9YMDF/show/ Ho ottenuto ~ 21000 per Chrome 28, 26000..53000 per Firefox 20+, e ~ 3000 per IE10 su Windows 7 SP1 64-bit. Opera 12.X ha una profondità di stack molto simile a 32768. E ho trovato una sfortunata installazione di IE8 con una profondità di stack pari a 276! – Victor

+0

È possibile confrontare questi risultati con [il BrowserScope collegato qui] (http://stackoverflow.com/questions/2805172/what-are-the-js-recursion-limits-for-firefox-chrome-safari-ie-etc) –

5

Questo è specifico del browser, non solo la dimensione dello stack, ma anche ottimizzazioni, cose come l'ottimizzazione della ricorsione in coda e cose del genere. Immagino che l'unica cosa affidabile qui sia quella di codificare in un modo che non metta tonnellate di cose nello stack, o testare manualmente (leggendo in profondità nella documentazione di) ogni browser. Dopotutto, quando vedi l'errore "Troppa ricorsione" o simili, sai già che c'è qualcosa di veramente sbagliato nel tuo codice.

+0

il TCO è davvero fatto in JavaScript? Leggo ES6 potrebbe ottenere supporto ma non penso che sia stato ancora implementato. –

+0

Il TCO è dietro un flag in chrome al momento (sono in corso di valutazione due diverse implementazioni). Non sono a conoscenza di browser che lo hanno implementato per impostazione predefinita. –

+1

@JanusTroelsen: ES2015 ("ES6") richiede effettivamente i motori per eseguire il TCO. V8 ce l'ha, ma il team V8 non lo considera "stabile", quindi devi abilitarlo. (V8 classifica le caratteristiche che hanno iniziato come "spedizione" [fatto], "stabile" e "in corso". Il TCO rimane "in corso" ma le basi sono lì per tutti e tre i generatori di codice del V8. non lo hanno ancora promosso a "stabile" perché stanno ancora ottimizzando/bugfinding/bugfixing. Più qui: http: // StackOverflow.it/a/30369729/157247) –

Problemi correlati