1

私はJavascriptで多くの再帰を行っており、スタックがオーバーフローしないようにするために、setTimeoutを使用しています。簡単な理論例を次に示します。

go(){
    setTimeout(function(){
        x++;
        go();
    },1);
}

xまた、数秒ごとにコンソールにログを記録する関数がありますが、それは問題ではありません。私が見ているのは、タイムアウトにどのような値を入力しても、例では1を使用していますが、スクリプトは1秒間に1000回しか実行できないということです。私は数億のレベルで再帰を行っているので、これは十分な速さではありません。タイムアウト値を0、.1、または1/10に設定しても、1秒間に約1000回しか取得できません。私は32ビットと64ビットのブラウザ(ChromeとFirefox)を使ってみましたが無駄になりました。

どうすればスピードを一段上げることができますか?また、私はこれらすべてにおいて比較的新しいので、解決策が単純なものであれば素晴らしいでしょう。

ああ、言及するのを忘れました:setTimeoutを完全に削除すると、毎回スタックがオーバーフローします。

助けてくれてありがとう!

4

4 に答える 4

3

あなたの解決策は、現在のコードを実行させることではなく、コードを再考することです。

コードで再帰をどのように使用しているかはわかりませんが、明らかに間違って使用しています。

再帰を適切に使用する場合は、スタックをオーバーフローさせることはできません。数億のレベルで再帰呼び出しを行う場合、それは少なくとも100万倍多すぎます。

再帰を使用する場合の一般的なアプローチは、レベルごとに作業を半分に分割することです。そうすれば、約30レベルより深くなることなく、メモリに収まるすべてのアイテムを処理できます。

于 2013-03-10T00:20:21.357 に答える
2

私はあなたがしたようなことを試みて、解決策を見つけました!再帰や関数は必要ありませんが、必要なのは、ループ内で1間隔ずつ、必要な関数で関数setTimeoutを使用することだけです。たとえば、forループが10回繰り返される場合、10個のタイマーが4ミリ秒ごとに同じ機能を実行します。コードはますます速く繰り返し実行されます。setIntervalfor

たとえば、コードは次のようになります。

function onload() {
   for (var i = 0; i < 10; i++)
      setInterval(go, 1);
}
function go() {
   x++;
}
于 2014-01-10T20:45:23.833 に答える
1

JavaScriptはシングルスレッドであり、setTimeoutは操作をキューの最後に置きます。遅延を減らしても、前の操作が完了するのを待ってから、追加した操作が開始されます。

于 2013-03-10T00:25:07.970 に答える
1

setTimeoutを4ミリ秒未満待機させることはできません。これが、setTimeoutがHTML標準で定義されている方法です(公式仕様はこちら)。多くの場合、問題はコードの構造にあります。残りのコードを見せてください。多分私たちはそれを整理するのを手伝うことができます。

于 2013-03-10T00:31:49.650 に答える