Эксплуатационная стоимость Memcopy в C/С++

Поэтому всякий раз, когда я пишу код, я всегда думаю о последствиях производительности. Я часто задавался вопросом, какова "стоимость" использования memcopy относительно других функций с точки зрения производительности?

Например, я могу записать последовательность чисел в статический буфер и сконцентрироваться на кадре внутри буфера, чтобы сохранить кадр, как только я доберусь до конца буфера, я мог бы memcopy все это, чтобы начало ИЛИ Я могу реализовать алгоритм для амортизации вычисления.

Ответы

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Во-вторых, memcpy реализуется с помощью ассемблера (см. memcpy.asm), и, я думаю, это самое быстрое решение для копирования памяти.

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

Ответ 4

memcpy() копирует содержимое памяти в источник в dest. Очевидно, что копирование является линейным по отношению к количеству элементов в источнике. То, что составляет оптимальный размер элемента, является машинной зависимостью. Во всяком случае, в зависимости от контекста операции может применяться многократная отимизация черной магии. В С++ обычно разумнее избегать memcpy и использовать конструкторы назначения или копирования.

Ответ 5

Рассмотрим книгу Маккормика "Код завершен". Безжалостно красть оттуда ---

  • Улучшение алгоритма обычно имеет наибольшую отдачу в производительности.

  • Простые инструкции позволяют компилятору эффективно оптимизировать. У них низкая стоимость программиста. Обычно они повышают читаемость. В любом случае, они по умолчанию должны быть "должны".

Как уже упоминалось, memcpy уже настроен и часто очень эффективен для больших блоков памяти. Так почему бы избежать этого, если ситуация диктует сохранение данных?

В целом не оптимизируйте без причины. Предположим, вы пишете отчет против массивного набора данных. Ни один пользователь не ожидает мгновенного ответа в этом сценарии. Они начинают работу и идут закуской. Поэтому, если ваш код работает через 10 минут или три минуты, это не имеет значения. Им. Тет не заметит. И... они пишут вашу зарплату.

Оптимизация программистов - это огромная авансовая стоимость. Поэтому потратьте эту стоимость только там, где это необходимо.