2008-11-27 19 views
22

Dans quelles circonstances dois-je m'attendre à ce que memcpys surpasse les affectations sur le matériel moderne INTEL/AMD? J'utilise GCC 4.2.x sur une plate-forme Intel 32 bits (mais je m'intéresse aussi à 64 bits).memcpy vs affectation en C

+0

Question intéressante! Comme vous êtes évidemment préoccupé sur la façon d'améliorer la vitesse des opérations de mémoire: Récemment, j'ai lu sur le rôle de la compression dans le transfert de la mémoire de quelqu'un qui développe pyTables: http://www.pytables.org/docs/StarvingCPUs.pdf Comme décrit, l'utilisation habituelle de memcpy pourrait être lente par rapport à ses améliorations avec des compresseurs très rapides ([blosc] (http://blosc.pytables.org/trac/)). Veuillez ne considérer que ceci pour des trucs de haute performance seulement! – math

+0

Cette question est assez large. –

Répondre

33

Vous ne devriez jamais vous attendre à ce qu'ils dépassent les affectations. La raison en est que le compilateur utilisera quand même memcpy quand il pense que ce serait plus rapide (si vous utilisez optimists). Si ce n'est pas le cas et si la structure est raisonnable et qu'elle s'insère dans des registres, une manipulation directe du registre pourrait être utilisée, ce qui ne nécessiterait aucun accès à la mémoire.

GCC dispose de motifs de déplacement de bloc spéciaux en interne qui déterminent quand changer directement les registres/cellules de mémoire, ou quand utiliser la fonction memcpy. Notez que lors de l'assignation de la structure, le compilateur sait au moment de la compilation quelle sera la taille du mouvement, ce qui lui permet de dérouler de petites copies (faire un mouvement n fois en ligne au lieu de boucler) par exemple. Remarque -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 sait mieux quand utiliser memcpy que le compilateur lui-même?

+4

Notez que l'inverse peut s'appliquer - dans GCC au moins, memcpy d'une petite taille constante est remplacée par des instructions de copie, et si elle est utilisée avec un pointeur vers une petite source et/ou destination, registres. Donc: faire tout ce qui résulte du code le plus simple. –

+2

Vous ne devriez pas vous attendre à ce que l'un surpasse l'autre. Si vous avez un problème de performance, vous devez le profiler, voir si l'affectation/memcpy est le problème, et si c'est le cas, essayez de les changer pour utiliser l'autre, et voir si cela fonctionne mieux. Plus de profilage, moins de devinettes. ;) – jalf

+1

C'est-à-dire, je m'attendrais à ce que "les devoirs surpassent memcpy" soit également faux, étant donné que l'interrogateur a spécifié un GCC récent. Mais en supposant qu'aucune distribution ne soit nécessaire, je suis d'accord avec votre conseil d'utiliser l'assignation, car il en résulte le code le plus clair. –