JavaScriptサポートの最大再帰コール回数分析
950 ワード
JavaScriptエンジンは何回再帰的に呼び出されますか?
再帰的に呼び出す
以下の関数で答えを見つけられます.(Ben Almanからインスピレーションされたgist)
ECMAScript 6の末尾呼び出し最適化ES 6は、末尾呼び出し最適化されています.もし関数の最後のステップが関数呼出であるなら、サブ関数ではなく「ジャンプ」されます.これはES 6(厳格なモード)で、少しだけcomputteMaxCallStockSize関数を変えたら永遠に実行できます.
再帰的に呼び出す
以下の関数で答えを見つけられます.(Ben Almanからインスピレーションされたgist)
function computeMaxCallStackSize() {
try {
return 1 + computeMaxCallStackSize();
} catch (e) {
// Call stack overflow
return 1;
}
}
3つの結果:
Node.js: 11034
Firefox: 50994
Chrome: 10402
これらの数字は何を表していますか?Aleph氏は、V 8において、再帰的呼び出しの数は、2つの量に依存することを指摘する.スタックのサイズとスタックフレーム(パラメータを保存する局所変数)のサイズ.あなたが通ってもいいです computteMaxCallStockSize()は、ローカル変数を追加して検証します.ECMAScript 6の末尾呼び出し最適化ES 6は、末尾呼び出し最適化されています.もし関数の最後のステップが関数呼出であるなら、サブ関数ではなく「ジャンプ」されます.これはES 6(厳格なモード)で、少しだけcomputteMaxCallStockSize関数を変えたら永遠に実行できます.
function computeMaxCallStackSize(size) {
size = size || 1;
return computeMaxCallStackSize(size + 1);
}