【发布时间】:2017-06-24 05:03:07
【问题描述】:
我有一个算法,它以相对较深的递归方式工作,因此最终会发生超出最大堆栈大小的异常(不是无限递归!)。
我的算法可以自行拆分,使用 asap 异步进行,但是每次这样做都会大大减慢执行速度。我想要一种(快速)方法来找出当前的堆栈使用百分比,所以如果它低于 90%,我的算法可以决定同步继续,但当它超过时异步继续。我知道这个值必须在内部,但有没有办法访问它?
另一方面,我可以想象捕获最大堆栈大小超出错误,但我read here,这是不可能的(为什么不呢?抛出这个异常意味着返回给调用者,这实际上应该减少堆栈大小并且旧的堆栈条目应该仍然完好无损???)
当然,一种方法是通过我的所有函数传递一个计数器变量,但这很尴尬。同样不清楚的是,我的堆栈在哪个计数器值为 90%,因为我不知道堆栈有多大以及我的每个堆栈帧有多大。
所以实际上,在这种情况下,JavaScript 似乎天生就失败了,即使程序员可以避免它,如果他可以访问他需要的信息 - 这些信息存在于某处但出于未知原因保密?
【问题讨论】:
-
请展示你的作品。这听起来像是您的算法的问题,而不是 javascript 解释器如何运行它。你在做什么?节点还是浏览器?你的算法甚至试图完成什么?我们需要这些细节。
-
我无法提供“算法”——它处理数据并根据数据递归地构建自己。我的算法没有问题。当数据结构嵌套足够深时,实际上会发生这种情况,堆栈会在没有无限递归的情况下运行。
-
如果你的递归太深以至于溢出堆栈,你需要重写你的算法,所以做短尾递归。
-
那是在我的问题中写的 - 我知道这一点。我可以分裂,这只是“何时”的问题。但是由于您可以捕获超出最大调用堆栈的异常,“何时”现在变得很容易......
-
处理这个问题的方法太可怕了;正确编写算法;不要依靠古怪的系统怪癖来应对您的低效率。以防御性的方式写作,而不是冒犯性地写作。