Максимальный размер стека вызовов в WebKit в три раза больше, чем в V8? Зачем? - PullRequest
0 голосов
/ 20 марта 2019

Я вижу из этого сообщения в блоге следующую функцию для вычисления максимального размера стека вызовов:

function computeMaxCallStackSize() {
    try {
        return 1 + computeMaxCallStackSize();
    } catch (e) {
        // Call stack overflow
        return 1;
    }
}

при запуске из консоли Chrome результат 12530 (для V8)

Предполагая, что одна и та же функция вычисляет один и тот же результат для WebKit, почему при запуске для Safari 36243 является результатом?Это в три раза больше?Единственный раз, когда я сталкивался с этой ошибкой, - это создание хорошего бесконечного цикла.Это произвольное решение?Приносит ли больший размер стека большие преимущества?

1 Ответ

1 голос
/ 21 марта 2019

Максимальное количество (рекурсивных или нет, неважно) вызовов определяется (1) размером доступного стекового пространства, деленным на (2) размер каждого стекового кадра активной (ых) функции (й).

(1) имеет верхний предел, установленный операционной системой;в системах, о которых я знаю, обычно это от 1 до 8 МБ.Ниже этого предела движок JavaScript может установить собственное ограничение.V8 устанавливает ограничение чуть менее одного мегабайта на всех платформах, чтобы разные платформы вели себя как можно ближе друг к другу.Я не знаю, что делает Safari / JavaScriptCore.

(2) зависит от деталей реализации механизма JavaScript (в частности, от того, сколько слотов в каждом фрейме стека он использует для внутренних данных), а также отколичество локальных переменных в каждой из задействованных функций.

Как вы заметили, обычно предел достигает стека только в случае случайной бесконечной рекурсии.Таким образом, для большинства реальных приложений конкретное значение ограничения не имеет значения, и больший стек не дает никаких преимуществ.

Обратите внимание, что пространство стека не связано с максимальным потреблением памяти (иначе пространство кучи).Вы можете иметь гигабайты кучи только с мегабайтом стека.

...