Является ли memcpy() обычно быстрее, чем strcpy()?

Является memcpy() обычно быстрее, чем strcpy() (на большинстве реальных платформ)? (Я предполагаю, что размер строки известен.)

Если я правильно помню ассемблер i386, есть команды "loop", которые копируют заданное количество байтов или слов. Таким образом, это самый быстрый способ, в то время как реализация ассемблера strcpy() i386 будет использовать ручную проверку для '\ 0' в обычном цикле.

Итак, я чувствую, что на x86 memcpy() быстрее, чем strcpy().

Как насчет других архитектур?

Ответы

Ответ 1

Если вы знаете размер данных, которые нужно скопировать, то memcpy() должен быть таким же быстрым или быстрым, чем strcpy(). В противном случае memcpy() нельзя использовать отдельно, а strcpy() должен быть таким же быстрым или быстрым, чем strlen(), за которым следует memcpy().

Однако...

Множество реализаций memcpy() и/или strcpy() и/или strlen() предназначены для эффективной обработки больших объемов данных. Это часто означает дополнительные накладные расходы на запуск (например, определение выравнивания, настройка SIMD, управление кешем и т.д.) И делает эти реализации плохими (медленными) для копирования небольших объемов данных (что гораздо более вероятно в хорошо написанном коде). Из-за этого "должно быть так быстро или быстро" не обязательно означает "так же быстро или быстро". Например, для небольших объемов данных memcpy(), оптимизированный для больших объемов данных, может быть значительно медленнее, чем a strcpy(), который не оптимизирован для больших объемов данных.

Также обратите внимание, что основная проблема заключается в том, что общий код (например, memcpy() и strcpy()) не может быть оптимизирован для конкретного случая. Лучшим решением было бы иметь несколько функций - например, memcpy_small(), который оптимизирован для копирования небольших объемов данных и memcpy_large(), оптимизированных для плохого кода, который не позволяет копировать большой объем данных.

Ответ 2

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