Лучший способ получить доступную оставшуюся память стека в Java? - PullRequest
4 голосов
/ 14 декабря 2011

Каков наилучший способ во время рекурсивного вызова получить или рассчитать доступную оставшуюся память стека в Java?

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

Я уже выполнил «кучную» версию, которая содержала накладные расходы на быстродействие, поэтому я делаю эту оптимизацию.)

Ответы [ 5 ]

1 голос
/ 14 декабря 2011

Я удивлен, что итеративный подход менее эффективен. Обычно рекурсивный подход будет медленнее из-за накладных расходов на вызовы методов. Если ваш алгоритм может быть реализован как хвост-рекурсивный, он почти наверняка будет быстрее итеративной реализации. Можете ли вы рассказать нам больше о том, что вы на самом деле пытаетесь сделать? Возможно, разница в производительности более алгоритмична, чем просто переключение итерации на рекурсию. Вот пример из некоторых лекционных заметок CS , в которых упоминается рекурсивный подход к вычислению чисел Фибоначчи, который равен O (2 ^ n), тогда как итеративный подход - O (n). Я считаю (хотя я не пробовал) возможно написать рекурсивный генератор чисел Фибоначчи, который будет O (n).

Edit:

Последняя мысль. ИМХО, было бы намного лучше использовать более медленный подход, свободный от проблем переполнения стека, чем вводить всю сложность попыток определить, что вы собираетесь переполнить стек, и иметь какой-то резервный механизм, чтобы избежать этого.

1 голос
/ 14 декабря 2011

Я бы написал метод менее рекурсивным. Часто есть способы сделать меньше (или нет) рекурсивных вызовов.

Если вы рекурсивно суммируете список, добавляя первое значение к сумме остальных, это вызовет глубину N. Однако, если вы сократите список пополам и суммируете значения. (вернуть значение, если в списке только один) рекурсивная глубина равна log2 (N).

1 голос
/ 14 декабря 2011

Зачем тебе это нужно? Просто любопытство? Что такое единицы измерения - байты или количество рекурсивных вызовов?

Вы всегда можете сделать бесконечный рекурсивный вызов, поймать StackOverflowError и сосчитать кадры стека

1 голос
/ 14 декабря 2011

Хммм.Если вы беспокоитесь, вы всегда можете сохранить счетчик глубины как часть своей рекурсии.

1 голос
/ 14 декабря 2011

Нет способа сделать это в переносимом виде.

Мало того, что это зависит от ОС, на практике максимальный размер стека зависит от множества ограничений (ulimit -c, количестводоступная виртуальная память, настройки -Xss и -XX:ThreadStackSize и т. д.).Это затрудняет определение того, какое ограничение будет применено первым, даже если вы можете надежно измерить, сколько стекового пространства было использовано до сих пор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...