Повышение производительности при использовании буфера в куче над стеком (C) - PullRequest
0 голосов
/ 08 октября 2018

У меня есть небольшой буфер в 1024 байта, который я использую для хранения временных данных и последующей записи в больший буфер.Я повторно использую этот небольшой буфер несколько раз.

Есть ли какое-то преимущество в производительности для создания этого буфера в куче, а не в стеке?

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

Есть идеи?Это код С.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

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

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

Для справки, в macOS инструменты Apple по умолчанию устанавливают 8 МБ для основного стека и 2 МБ для каждого потока.

0 голосов
/ 08 октября 2018

Как правило, стек распределение всегда быстрее, чем выделение кучи.

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

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

Что касается доступа к памяти после ее выделения, стек и куча должны работать одинаково.

Самое главное, выделять большой объем данных в стеке не рекомендуется, поскольку он имеет ограниченный размер.1024 байта довольно велики, поэтому рекомендуется хранить их в куче только по этой причине.

...