schildi: stackspeicher größe

hallo,

weiss jemand wie javascript seinen stackspeicher verwaltet, bzw. wo die grenzen liegen und wie man sie evtl. auch umgehen kann?

die erste funktion läuft durch und speichert alle 100000 einträge in dem array ohne überlauf.

die zweite rekursive funktion dagegen verursacht schon bei 1000 (firefox) bzw 1124 (ie) durchläufen einen overflow des stackspeichers:

  
function test()  
{  
 arr = new Array();  
 for(i=0;i<100000;i++)  
 {  
  arr[arr.length] = "X";  
 }  
}  
  
test();  
  
function rek(i,arr)  
{  
 if(!i) i="";  
 if(!arr) arr=new Array();  
 if(i.length<=1125)  
 {  
  i+="X";  
  document.write(arr.length+" | ");  
  document.write(i+"<br>");  
  arr[arr.length] = "X";  
  rek(i,arr);  
  arr.length = arr.length-1;  
  document.write(arr.length+" | ");  
  document.write(i+"<br>");  
 }  
  
}  
rek();  

vielleicht hat ja jemand bissle mehr ahnung davon.
wär interessant, wie man da am besten vorgehen könnte, ohne zb. mit einer rekursion dieser art so früh an grenzen zu stoßen, oder einfach generell bissle mehr über das ganze zu wissen.

gruß!

  1. hi,

    function test()
    {
    arr = new Array();
    for(i=0;i<100000;i++)
    {
      arr[arr.length] = "X";
    }
    }

      
    was macht diese funktion?  
    hunderttausend mal dem array-element mit dem index 0 den wert "X" zuweisen ...?  
      
    (möchte da vielleicht der schleifenzähler i als array-index in den eckigen klammern stehen, statt arr.length?)  
      
    gruß,  
    wahsaga  
      
    
    -- 
    /voodoo.css:  
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    
    1. Hallo wahsaga,

      arr = new Array();
      for(i=0;i<100000;i++)
      {
        arr[arr.length] = "X";
      }

      was macht diese funktion?
      hunderttausend mal dem array-element mit dem index 0 den wert "X" zuweisen ...?

      Nö, hunderttausendmal ein Element am Ende hinzufügen. Herrje, da ist es doch schon wieder, das berühmte ±1-Problem mit Indizes und so...

      (möchte da vielleicht der schleifenzähler i als array-index in den eckigen klammern stehen, statt arr.length?)

      Das würde in diesem speziellen Fall exakt dasselbe bewirken. ;-)
      So long,

      Martin

      1. Das würde in diesem speziellen Fall exakt dasselbe bewirken. ;-)
        So long,

        wahsaga hatte schon recht. das ist in sonem fall quatsch es mit .length zu machen, weil es eindeutig langsamer sein wird als hier i einzusetzen.

        aber darum gings doch in dem thread nicht leudde! ;)

    2. 你好 wahsaga,

      function test()
      {
      arr = new Array();
      for(i=0;i<100000;i++)
      {
        arr[arr.length] = "X";
      }
      }

      
      >   
      > was macht diese funktion?  
      > hunderttausend mal dem array-element mit dem index 0 den wert "X"  
      > zuweisen ...?  
        
      arr.length ist immer eins größer als die Anzahl Elemente. Damit wächst der  
      Array bei jedem Schleifendurchlauf um ein Element: erster Durchlauf 0,  
      zweiter Durchlauf 1, dritter Durchlauf 2, …  
        
      再见,  
       克里斯蒂安  
      
      -- 
      Wenn der Schüler bereit ist, erscheint der Meister.  
        
      <http://wwwtech.de/>  
      
      
      1. hi,

        arr.length ist immer eins größer als die Anzahl Elemente.

        Ach ja, verflixt, stimmt ja :-)

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
    3. (möchte da vielleicht der schleifenzähler i als array-index in den eckigen klammern stehen, statt arr.length?)

      ist doch nurn schnell hingeschriebenes beispiel ;)