При манипулировании большими массивами в конечном рекурсивном цикле, какую точку мне следует переключать со стека на кучу? - PullRequest
2 голосов
/ 22 августа 2011

Я очень новичок в C ++ и пытаюсь оптимизировать скорость программы, которая выполняет вычисления для элементов в большом одномерном массиве в рекурсивном цикле. Фактически, одномерный массив хранит значения трехмерной матрицы, каждое из которых представляет собой плавающую точку. Размеры матриц могут быть до 1500 x 2000 x 200.

Я прочитал, что память стека может быть прочитана быстрее, чем память кучи, но есть ли предел размера, при котором она становится неэффективной или даже невыполнимой, если предположить, что размер стека достаточно большой, чтобы вместить все данные?

Спасибо за вашу помощь и извинения, если это глупый вопрос!

PS Если вы можете предложить какие-то другие методы, которые я должен изучить, чтобы ускорить мою программу, я был бы очень признателен!

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

Нет разницы в скорости между стеком и кучей памяти.Лучший способ оптимизировать код - это обходить массивы линейным способом, чтобы максимально использовать кэш.

1 голос
/ 22 августа 2011

Переменные стека действительно могут считываться быстрее, чем переменные кучи внутри функции , в которой они определены. Все остальные функции получают только указатель / ссылку на переменную, которая аналогична той, что была бы для них. переменная, выделенная кучей.

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

Наконец, эта небольшая разница вряд ли повлияет на общую скорость вашей программы.


Оптимизация - это, как правило, область экспертов, или, по крайней мере, людей, которые достаточно глубоко разбираются в профилировщиках и имеют достаточное понимание базовой семантики и аппаратного обеспечения языка, а также того, как осуществляется перевод с высокого уровня на низкий уровень ... Эксперты, или подражать экспертам тогда:)

  • предпочитают оптимизировать алгоритм , а не его реализацию (для начала)
  • не прыгать (случайно) вокруг памяти

Если ваша функция все еще слишком медленная, тогда ... опубликуйте код! Хотя это может быть лучше подходит для codereview.stackexchange.com.

1 голос
/ 22 августа 2011

есть ли предел размера, при котором он становится неэффективным или даже невыполнимым, если предположить, что я установил размер стека достаточно большим, чтобы вместить все данные?Возможно, вы захотите изменить рекурсивный цикл в итеративный цикл.Если это не хвостовой рекурсивный цикл и компилятор не достаточно умен, чтобы оптимизировать его, что, например, делает g ++, начиная с -O2.

...