WebKit 中的最大调用堆栈大小是 V8 的三倍吗?为什么?
Is the maximum call stack size in WebKit three times greater than that of V8? Why?
我从 this 博客 post 中看到以下计算最大调用堆栈大小的函数:
function computeMaxCallStackSize() {
try {
return 1 + computeMaxCallStackSize();
} catch (e) {
// Call stack overflow
return 1;
}
}
如果 运行 来自 Chrome 的控制台,12530
是结果(对于 V8)
假设相同的函数为 WebKit 计算相同的结果,为什么 Safari 的 运行 是 36243
结果?这是~三倍大?我 运行 唯一一次遇到此错误是在创建良好的 ole 无限循环时。这是一个武断的决定吗?筹码量越大,收益越大吗?
最大调用次数(递归与否,无关紧要)由 (1) 可用堆栈的大小 space 除以 (2) 的每个堆栈帧的大小决定活动功能。
(1) 有操作系统强加的上限;在我知道的系统上,它通常在 1MB 到 8MB 之间。低于该限制,JavaScript 引擎可以设置自己的限制。 V8 在所有平台上设置了小于 1 MB 的限制,以便让不同平台的行为尽可能相似。我不知道 Safari/JavaScriptCore 是做什么的。
(2) 取决于 JavaScript 引擎的实现细节(具体来说,它在每个堆栈帧中用于内部数据的槽的数量),以及每个中局部变量的数量涉及的功能。
如您所见,通常只有在意外无限递归的情况下才会遇到堆栈限制。所以对于大多数实际应用来说,limit 的具体值并不重要,更大的堆栈也没有任何好处。
请注意,堆栈 space 与最大内存消耗(也称为堆 space)无关。您可以拥有千兆字节的堆,而只有一兆字节的堆栈。
我从 this 博客 post 中看到以下计算最大调用堆栈大小的函数:
function computeMaxCallStackSize() {
try {
return 1 + computeMaxCallStackSize();
} catch (e) {
// Call stack overflow
return 1;
}
}
如果 运行 来自 Chrome 的控制台,12530
是结果(对于 V8)
假设相同的函数为 WebKit 计算相同的结果,为什么 Safari 的 运行 是 36243
结果?这是~三倍大?我 运行 唯一一次遇到此错误是在创建良好的 ole 无限循环时。这是一个武断的决定吗?筹码量越大,收益越大吗?
最大调用次数(递归与否,无关紧要)由 (1) 可用堆栈的大小 space 除以 (2) 的每个堆栈帧的大小决定活动功能。
(1) 有操作系统强加的上限;在我知道的系统上,它通常在 1MB 到 8MB 之间。低于该限制,JavaScript 引擎可以设置自己的限制。 V8 在所有平台上设置了小于 1 MB 的限制,以便让不同平台的行为尽可能相似。我不知道 Safari/JavaScriptCore 是做什么的。
(2) 取决于 JavaScript 引擎的实现细节(具体来说,它在每个堆栈帧中用于内部数据的槽的数量),以及每个中局部变量的数量涉及的功能。
如您所见,通常只有在意外无限递归的情况下才会遇到堆栈限制。所以对于大多数实际应用来说,limit 的具体值并不重要,更大的堆栈也没有任何好处。
请注意,堆栈 space 与最大内存消耗(也称为堆 space)无关。您可以拥有千兆字节的堆,而只有一兆字节的堆栈。