Объединение двух буферов в один - PullRequest
0 голосов
/ 18 октября 2011

Мне нужно иметь два буфера (A и B), и когда один из буферов заполнен, он должен записать свое содержимое в объединенный буфер - C.Использование memcopy кажется слишком медленным для этой операции, как отмечено ниже в моем вопросе.Любое понимание? '

Я не пробовал, но мне сказали, что memcopy не будет работать.Это встроенная система.2 буфера.Оба разных размера и когда они полностью тупые к общему буферу 'C', который больше, чем два других .. Не уверен, почему я понизился рейтингом.* Буфер A и B будет записан до того, как C будет полностью пустым.

Запись memcopy занимает слишком много времени, и общий буфер 'C' перегружен.

Ответы [ 2 ]

9 голосов
/ 19 октября 2011

memcpy - довольно быстрый способ копирования памяти. Это часто присуще компилятору и высоко оптимизировано. Если он слишком медленный, вам, вероятно, придется искать другой способ ускорить вашу программу.

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

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

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

4 голосов
/ 19 октября 2011

Единственный способ объединить два буфера без memcpy - это связать их, как связанный список фрагментов буфера (или массив фрагментов).

Учтите, что буфер не всегда должен быть смежным. Я проделал большую работу с изображениями 600 точек на дюйм, что означает очень большие буферы. Если вы можете разбить их на последовательность меньших фрагментов, это поможет уменьшить фрагментацию и ненужное копирование из-за увеличения буфера.

В некоторых случаях буферы должны быть смежными, если ваш API / микроконтроллер требует этого. Например, растровые функции Windows требуют непрерывности. Вы можете попробовать использовать функцию C realloc, но она может работать внутренне, как комбинация malloc + memcpy + free. В любом случае, как уже говорили другие, memcpy считается самым быстрым способом копирования смежных буферов.

Если буфер должен быть смежным, вы можете зарезервировать большое адресное пространство и зафиксировать его по требованию. Реализация зависит от платформы. Например, на Win32 функция VirtualAlloc может сделать это. Это дает вам очень большой непрерывный буфер, из которого выделена (зафиксирована) только часть. Позже вы можете фиксировать дальнейшие страницы по мере роста буфера. Этот прием требует концепции виртуальной памяти, которая может быть недоступна на микроконтроллере.

...