c performance x86 memcpy strcpy

¿Es memcpy() usualmente más rápido que strcpy()?



memset (2)

En casi cualquier plataforma, memcpy() será más rápido que strcpy() cuando copie el mismo número de bytes. La única vez que strcpy() o cualquiera de sus equivalentes "seguros" superaría a memcpy() sería cuando el tamaño máximo permitido de una cadena fuera mucho mayor que su tamaño real. Si uno tiene un búfer que podría contener una cadena de hasta un millón de caracteres, y uno quiere copiar la cadena en otro búfer de un millón de bytes, memcpy() tendría que copiar un millón de bytes, incluso si la cadena en el primer búfer era sólo dos caracteres de largo. Sin embargo, la función strcpy() o sus equivalentes serían capaces de salir temprano, y probablemente tomaría menos tiempo copiar dos caracteres que memcpy() requeriría copiar un millón.

¿ memcpy() suele ser más rápido que strcpy() (en la mayoría de las plataformas reales)? (Supongo que el tamaño de la cadena es conocido.)

Si recuerdo correctamente el ensamblador i386, hay instrucciones de loop que copian un número dado de bytes o palabras. Así que es la forma más rápida, mientras que la implementación del ensamblador strcpy() i386 usaría la comprobación manual de ''/0'' en un ciclo simple.

Así que siento que en x86 memcpy() es más rápido que strcpy() .

¿Qué hay de otras arquitecturas?


Si conoce el tamaño de los datos que se copiarán, entonces memcpy() debería ser tan rápido o más rápido que strcpy() . De lo contrario, memcpy() no se puede usar solo, y strcpy() debería ser tan rápido o más rápido que strlen() seguido de memcpy() .

Sin embargo...

Muchas implementaciones de memcpy() y / o strcpy() y / o strlen() están diseñadas para manejar eficientemente grandes cantidades de datos. A menudo, esto implica una sobrecarga de inicio adicional (p. Ej., Determinar la alineación, configurar SIMD, administración de caché, etc.) y hace que estas implementaciones sean malas (lentas) para copiar pequeñas cantidades de datos (lo cual es mucho más probable en un código bien escrito). Debido a esto, " debería ser tan rápido o más rápido " no implica necesariamente que " es tan rápido o más rápido ". Por ejemplo, para pequeñas cantidades de datos, un memcpy() optimizado para grandes cantidades de datos puede ser significativamente más lento que un strcpy() que no fue optimizado para grandes cantidades de datos.

También tenga en cuenta que el principal problema aquí es que el código genérico (por ejemplo, memcpy() y strcpy() ) no se puede optimizar para un caso específico. La mejor solución hubiera sido tener múltiples funciones, por ejemplo, memcpy_small() que está optimizada para copiar pequeñas cantidades de datos y memcpy_large() que está optimizada para el código incorrecto que no permite copiar una gran cantidad de datos.