2011-12-29 120 views
3

以下函數正在使用我的計算機上100%的CPU核心。有沒有一種方法可以將其重寫爲非遞歸?這會解決它還是因爲我的CPU太爛?其他人是否在他們的電腦上看到相同的性能問題?如何優化這個遞歸函數,它調用setTimeout()

代碼:

<html> 
<head> 
    <script type="text/javascript" src="jquery-1.7.1.js"></script> 
    <script type="text/javascript"> 
     function timeMsg(n,max,delay) 
     { 
      writeToLog(n + "th: &#" + n,n); 
      var temp = n + 1; 
      if(n < max){ 
       var t=setTimeout("timeMsg(" + temp + "," + max + "," + delay + ")",delay); 
      } 

     } 
     function writeToLog(text,n){ 
      $("#log").html($("#log").html() + text + "<br/>"); 
      //autoscrolling: doesn't work...' 

     } 
    </script> 
</head> 

<body> 
    <form> 
     <input type="button" value="Display alert box in 3 seconds" onClick="timeMsg(0,100000,100)" /> 
    </form> 

    <div id="log"></div> 

</body> 

回答

1

您可以設置一個全局變量來跟蹤當前的迭代,而不是使用稍微不同的值重複調用setTimeout,而是使用一個調用setInterval()來代替。 setInterval就像setTimeout,除了它會一直運行 - 你不必一次又一次地調用它。這可能有一些幫助。

+0

謝謝:)真正幫助它。 – user269334 2011-12-29 20:00:35

1

不應該使用100%的CPU。 (但實際性能取決於你的文檔的大小)。然而,一個明顯的改進是在setTimeout擺脫隱含eval的:

function timeMsg(n, max, delay) { 
    writeToLog(n + "th: &#" + n, n); 
    var temp = n + 1; 
    if(n < max) { 
     var t = setTimeout(function() { 
      timeMsg(temp, max, delay); 
     }, delay); 
    } 
} 

你也應該在的地方都使用append雙HTML (防)模式您目前正在使用:

function writeToLog(text,n){ 
    $("#log").append(text + "<br/>"); 
} 

沒有必要尋找#log兩次(讀取其html兩次)。

+0

這也幫助了 - 謝謝:) – user269334 2011-12-29 20:01:41

0

不,即使是書面的,它也不會爲我使用100%的CPU。

你應該做的第一件事是改變你的writeToLog函數。這是必須更快地追加比1的HTML塊)讀取現有的HTML,2)添加文字+ BR,3)寫了整個事情回。

function writeToLog(text,n){ 
     $("#log").append(text + "<br/>"); 
     //autoscrolling: doesn't work...' 

} 

除此之外,如果你想不阻止其他JS運行,那麼你需要使用setTimeout/setInterval方法來實現這個循環。否則,常規的for循環更快。

1

使用setInterval()開始,clearInterval()當您達到最大。

演示:http://jsfiddle.net/ThinkingStiff/PwASf/

腳本:

var timer; 

function startMsg(n, max, delay) { 

    timer = window.setInterval(function() { 
     timeMsg(n++, max); 
    }, delay);; 

}; 

function timeMsg(temp, max) { 

    writeToLog(temp + "th: &#" + temp, temp); 

    if(temp == max){ 
     window.clearInterval(timer); 
    } 

} 

function writeToLog(text,n){ 
    $(' #log').append(text + '<br/>'); 
} 

startMsg(1, 10, 1000); 

HTML:

<div id="log"></div>