增加浏览器中的堆栈大小

Increasing stack size in browsers

简短的问题:我有一个 javascript 非常深入的递归。我怎样才能增加堆栈大小以便我可以执行它(类似于 Unix 系统中的 "ulimit -s unlimited")?

长话短说:我要画一个图,我使用 Cytoscape JS (http://js.cytoscape.org/) coupled with the Dagre layout extension (https://github.com/cytoscape/cytoscape.js-dagre)。绘图算法深入递归,我最终在 Chrome 中得到 "Uncaught RangeError: Maximum call stack size exceeded",在 Firefox 中得到 "too much recursion"。如何将堆栈大小设置为无限或非常大(即像 Unix 系统中的 "ulimit -s unlimited")以便我可以绘制图形?

谢谢!

尝试更改您的算法以在函数的每次迭代中不使用尽可能多的堆栈 space。例如:

  • 在不使用时将局部变量设置为 null。
  • 尽可能使用全局变量进行临时计算。这样,那个临时变量就不会在堆栈上。
  • 在你的递归函数中使用更少的变量。在函数的不同部分为不同的事物重用相同的变量。
  • 将你的递归函数分解成几个函数。其中一些函数不会递归,因此当递归函数调用自身时,这些函数中的局部变量将不会继续。
  • 创建一个全球待办事项数组并将项目添加到此列表,而不是递归调用函数。使用 array() 对象的 push 和 pop 方法。
  • 减少递归函数的参数。而是传递一个对象。

希望这些想法对您有所帮助。

您无法在浏览器中更改堆栈大小,但您可以使用一个名为 trampolining.

的技巧

您可以在此处找到有效的代码解决方案:

How to understand trampoline in JavaScript?

Chrome 有一个标志:

chromium-browser --js-flags="--stack-size 2048"

您还需要 运行 ulimit -s unlimited 在 运行 上面的命令之前,但是:否则,您的深度递归 Javascript 代码将崩溃 Chrome.