memcpy vs asignación en C

3 minutos de lectura

¿Bajo qué circunstancias debo esperar que memcpys supere las asignaciones en el hardware moderno de INTEL/AMD? Estoy usando GCC 4.2.x en una plataforma Intel de 32 bits (pero también estoy interesado en 64 bits).

  • ¡Interesante pregunta! Como obviamente le preocupa cómo mejorar la velocidad de las operaciones de memoria: recientemente leí sobre el papel de la compresión en la transferencia de memoria de alguien que desarrolla pyTables: pytables.org/docs/StarvingCPUs.pdf Como se describe allí, el uso habitual de memcpy puede ser lento en comparación con sus mejoras con compresores muy rápidos (bloque). ¡Tenga en cuenta esto solo para material de alto rendimiento!

    – Matemáticas

    20 de marzo de 2012 a las 19:48

  • Esta pregunta es bastante amplia.

    – AD

    9 sep 2014 a las 19:32

avatar de usuario
Johannes Schaub – litb

Nunca debe esperar que superen las tareas. La razón es que el compilador usará memcpy de todos modos cuando crea que sería más rápido (si usa indicadores de optimización). De lo contrario, y si la estructura es razonablemente pequeña para caber en los registros, se podría usar la manipulación directa del registro que no requeriría ningún acceso a la memoria.

GCC tiene patrones especiales de movimiento de bloques internamente que determinan cuándo cambiar directamente los registros/celdas de memoria, o cuándo usar la función memcpy. Tenga en cuenta que al asignar la estructura, el compilador sabe en el momento de la compilación qué tan grande será el movimiento, por lo que puede desenrollar copias pequeñas (hacer un movimiento n veces seguidas en lugar de hacer un bucle), por ejemplo. Nota -mno-memcpy:

-mmemcpy
-mno-memcpy
    Force (do not force) the use of "memcpy()" for non-trivial block moves.  
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.

¿Quién sabe mejor cuándo usar memcpy que el propio compilador?

  • Tenga en cuenta que se puede aplicar lo contrario: al menos en GCC, memcpy de un tamaño constante pequeño se reemplaza con instrucciones de copia, y si se usa con un puntero a una fuente y / o destino pequeño, no no evitar que uno o ambos se optimicen en registros. Entonces: haga lo que resulte en el código más simple.

    –Steve Jessop

    27 de noviembre de 2008 a las 16:08

  • No debe esperar que uno supere al otro. Si tiene un problema de rendimiento, debe perfilarlo, ver si la asignación/memcpy es el problema y, de ser así, intente cambiarlos para usar el otro y ver si funciona mejor. Más perfiles, menos conjeturas. 😉

    – jalf

    27 de noviembre de 2008 a las 16:10

  • Es decir, esperaría que “las asignaciones superarán a memcpy” también sea falso, dado que el autor de la pregunta ha especificado un GCC reciente. Pero suponiendo que no se requiere conversión, estoy de acuerdo con su consejo de usar la asignación, ya que da como resultado el código más claro.

    –Steve Jessop

    27 de noviembre de 2008 a las 16:11

  • @jalf: Estoy totalmente de acuerdo. Dado que la pregunta era “¿cuál es más rápido?”, no “¿debería importarme cuál es más rápido?”, Creo que “el compilador se ocupará de eso hagas lo que hagas” es una respuesta justa, aunque en general la verdadera respuesta es probablemente “¿por qué estás preguntando?” 😉

    –Steve Jessop

    27 de noviembre de 2008 a las 16:13

  • Nunca digas nunca… Habíamos trabajado en un procesador integrado que utiliza un controlador de excepciones no alineado de software. Descubrimos que la asignación de estructuras (usando punteros) a menudo causaba excepciones no alineadas, mientras que memcpy no lo hacía. El costo de las excepciones fue muy alto, por lo que en el caso de que la memoria no estuviera necesariamente alineada, memcpy fue MUCHO más rápido que la asignación.

    – Juan

    11/10/2013 a las 18:35

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad