более быстрая альтернатива memcpy?

У меня есть функция, которая делает memcpy, но он поднимает огромное количество циклов. Существует ли более быстрая альтернатива/подход, чем использование memcpy для передвижения фигуры памяти?

37
задан PeeHaa 3 November 2013 в 18:03
поделиться

12 ответов

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

119
ответ дан 27 November 2019 в 03:58
поделиться

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

В этом случае я бы согласился с предложением nos найти способ НЕ копировать материал ..

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

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

1
ответ дан 27 November 2019 в 03:58
поделиться

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

6
ответ дан 27 November 2019 в 03:58
поделиться

Обратитесь к руководству по компилятору / платформе. Для некоторых микропроцессоров и DSP-наборов использование memcpy намного медленнее, чем операции встроенных функций или DMA .

2
ответ дан 27 November 2019 в 03:58
поделиться

Пожалуйста, предложите нам больше деталей. На архитектуре i386 вполне возможно, что memcpy является самым быстрым способом копирования. Но на других архитектурах, для которых компилятор не имеет оптимизированной версии, лучше всего переписать функцию memcpy. Я сделал это на пользовательской архитектуре ARM, используя язык ассемблера. Если вы передаете большие куски памяти, то DMA - это, вероятно, тот ответ, который вы ищете.

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

11
ответ дан 27 November 2019 в 03:58
поделиться

Если ваша платформа поддерживает это, посмотрите, можно ли использовать системный вызов mmap (), чтобы оставить свои данные в файле ... обычно ОС справляется с этим лучше. И, как все говорили, избегайте копирования, если это вообще возможно; указатели - ваш друг в таких случаях.

2
ответ дан 27 November 2019 в 03:58
поделиться

Нет, вы слишком много это называете.

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

0
ответ дан 27 November 2019 в 03:58
поделиться

Иногда такие функции, как memcpy, memset, ... реализуются двумя разными способами:

  • один раз как реальная функция
  • один раз как некоторая сборка, которая сразу встроена

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

Изменить: См. http://msdn.microsoft.com/en-us/library/tzkfha43%28VS.80%29.aspx для объяснения встроенных функций компилятора Microsoft C.

3
ответ дан 27 November 2019 в 03:58
поделиться

Вы можете взглянуть на это:

http://www.danielvik.com/2010/02/fast-memcpy-in-c.html

Другой Идея, которую я бы попробовал, состоит в том, чтобы использовать методы COW для дублирования блока памяти и позволить ОС обрабатывать копирование по запросу, как только страница будет записана. Здесь есть несколько подсказок с использованием mmap () : Могу ли я сделать memcpy копирования при записи в Linux?

1
ответ дан 27 November 2019 в 03:58
поделиться

Обычно быстрее вообще не делать копию. Я не знаю, можете ли вы адаптировать свою функцию, чтобы не копировать, но на это стоит посмотреть.

3
ответ дан 27 November 2019 в 03:58
поделиться

Agner Fog имеет быструю реализацию memcpy http://www.agner.org/optimize/#asmlib

4
ответ дан 27 November 2019 в 03:58
поделиться

память в память обычно поддерживается в наборе команд ЦП, и memcpy обычно использует это. И это обычно самый быстрый способ.

Вы должны проверить, что именно делает ваш процессор. В Linux следите за входом и выходом подкачки и эффективностью виртуальной памяти с помощью sar -B 1 или vmstat 1 или просматривая / proc / memstat. Вы можете увидеть, что ваша копия должна вытолкнуть много страниц, чтобы освободить место, или прочитать их, и т. Д.

Это будет означать, что ваша проблема не в том, что вы используете для копии, а в том, как ваша система использует память . Возможно, вам потребуется уменьшить файловый кеш или начать запись раньше, или заблокировать страницы в памяти и т. Д.

0
ответ дан 27 November 2019 в 03:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: