2017-06-24 23 views
2

私はアルゴリズムを持っています。アルゴリズムは比較的深く再帰的に動作します。その結果、スタックの最大サイズが例外を超え、最終的に(無限の再帰なしに)発生します。Javascriptスタックがいっぱいになったときを知るには?

私のアルゴリズムは、しかし、大規模な、このたびは遅く実行をやって、できるだけ早く使用して非同期的に進めるために、自分自身を分割することができます。私は現在のスタック使用率を知るための(速い)方法を持っていますので、私のアルゴリズムは90%のように下回っていれば同期的に継続することができます。私はこの価値が内部的になければならないことは知っていますが、それにアクセスする方法はありますか?

一方、エラーを超えた最大スタックサイズをキャッチすると思いますが、私はread hereですが、これは不可能です(この例外をスローすると、実際にスタックサイズが縮小され、古いスタックエントリはまだこの???を行うために無傷でなければなりません)

もちろん一つの方法は、私のすべての機能を通じてカウンタ変数を渡すことであろうが、これは厄介です。また、スタックの大きさとスタックフレームの大きさがわからないため、スタックのカウンタ値が90%になっているかどうかは不明です。

だから、実際には、彼は彼が必要とする情報へのアクセスがあった場合はJavaScriptは、プログラマがそれを避けることができていても、その場合には失敗するために生まれているようだ - どこかに存在しているが、未知の理由のために秘密に?

+0

あなたの仕事をご提示ください。これは、JavaScriptのインタプリタがどのように動作しているかではなく、アルゴリズムの問​​題のようです。これは何をしていますか?ノードまたはブラウザ?あなたのアルゴは何を達成しようとしていますか?これらの詳細が必要です。 – Soviut

+0

私は "アルゴリズム"を提供できません - データを処理し、データに応じて再帰的にビルドします。私のアルゴリズムに問題はありません。実際にはデータ構造体が十分深くネストされている場合、スタックは無限の再帰を必要とせずに実行されます。 –

+0

再帰が深くなってスタックがオーバーフローしている場合は、アルゴを書き直してショートテール再帰を行う必要があります。 – Soviut

答えて

1

に沿って変数を渡すか、おそらく共有状態を参照することで、それを自分で追跡することなく、現在のスタック使用率を測定する方法はありません。

しかし、は、が満杯になると、コールスタックオーバーフローエラーをキャッチするだけです。 (あなたがリンクされ不明確質問は何か他のもの、I've written a new answer to clarify話していた。)あなたは、可能なスタックサイズの大まかなアイデアを得るためにこれを使用することができ、それはおそらく、最適化やものに応じて、異なる機能のための一貫性が保証されていません。

var maxDepth = 0; 
 
function popTheStack() { 
 
    maxDepth++; 
 
    popTheStack(); 
 
} 
 

 
try { 
 
    popTheStack(); 
 
} catch (ex) { 
 
    console.log("caught " + ex + " at depth " + maxDepth); 
 
}

+1

他の質問をよく読まなかった。jsperfを実行して、アルゴリズムでtry catchブロックを導入することがパフォーマンスにどの程度影響を与えるかを見ていきます。 –

1

それはブラウザに依存します。あなたのアプローチは問題のための最善の選択ではありません。もちろん、あなたの要求は重すぎて、それを処理できません。 もう1つのアプローチはアルゴリズムを逆再帰的にすることです。すべての再帰的解は常に対応する非再帰的解を持ちます。システムスタックではなく独自のスタックをシミュレートし、ループを実装して結果を見つけることができます。

関連する問題