оптимизированный memcpy

В Perl я просто использую команду соединения:

$ echo "Alpha
Beta
Gamma" | perl -e 'print(join(", ", map {chomp; $_} <> ))'
Alpha, Beta, Gamma

(Материал карты должен главным образом там создать список.)

На языках, которые не имеют встроенного, как C, я использую простое (непротестированное) повторение:

for (i = 0; i < N-1; i++){
    strcat(s, a[i]);
    strcat(s, ", ");
}
strcat(s, a[N]);

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

У Вас или есть к особому случаю первая запись или последнее.

17
задан Björn Lindqvist 13 April 2016 в 16:47
поделиться

7 ответов

Маловероятно. Ваш компилятор / стандартная библиотека, вероятно, будет иметь очень эффективную и адаптированную реализацию memcpy. И memcpy - это, по сути, самый низкий api для копирования одной части памяти в другую.

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

19
ответ дан 30 November 2019 в 10:16
поделиться

Во-первых, небольшой совет. Предположим, что люди, написавшие вашу стандартную библиотеку, не глупы. Если бы существовал более быстрый способ реализовать общий memcpy, они бы это сделали.

Во-вторых, да, есть альтернативы получше.

  • В C ++ используйте функцию std :: copy . Он делает то же самое, но в некоторых случаях он 1) безопаснее и 2) потенциально быстрее. Это шаблон, а это означает, что он может быть специализирован для определенных типов, что делает его потенциально более быстрым, чем обычный memcpy C.
  • Или вы можете использовать свои превосходные знания вашей конкретной ситуации. Разработчикам memcpy пришлось написать его, чтобы он хорошо работал в каждом случае. Если у вас есть конкретная информация о ситуации, в которой она вам нужна, вы можете написать более быструю версию. Например, сколько памяти нужно копировать? Как это согласовано? Это может позволить вам написать более эффективную memcpy для этого конкретного случая. Но в большинстве других случаев это будет не так хорошо (если вообще будет работать)
19
ответ дан 30 November 2019 в 10:16
поделиться

Эксперт по оптимизации Агнер Фог опубликовал оптимизированные функции памяти: http://agner.org/optimize/#asmlib . Однако это под GPL.

Некоторое время назад Агнер сказал, что эти функции должны заменить встроенные функции GCC, потому что они намного быстрее. Не знаю, делалось ли это с тех пор.

9
ответ дан 30 November 2019 в 10:16
поделиться

В зависимости от того, что вы пытаетесь сделать ... если это достаточно большой memcpy, и вы пишете только в копию редко, mmap с MMAP_PRIVATE для создания копии -write сопоставление может быть быстрее.

1
ответ дан 30 November 2019 в 10:16
поделиться

Этот ответ на очень похожий вопрос (о memset () ) применим и здесь.

По сути, это говорит о том, что компиляторы генерируют очень оптимальный код для memcpy () / memset () - и другой код в зависимости от природы объектов (размер, выравнивание и т. Д.) .

И помните, только memcpy () POD в C ++.

7
ответ дан 30 November 2019 в 10:16
поделиться

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

Иногда полезно иметь специализированное копирование слова, половинное слово, байтовое копирование memcpy, если это не оказывает слишком негативного воздействия в кэшах.

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

1
ответ дан 30 November 2019 в 10:16
поделиться

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

2
ответ дан 30 November 2019 в 10:16
поделиться
Другие вопросы по тегам:

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