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
Répondre
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?
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. –
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
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. –
- 1. Affectation parallèle en C++
- 2. Affectation de valeur en C#
- 3. Boost équivalent de memcpy?
- 4. Quelle est la différence entre memset et memcpy dans C
- 5. Copie d'un entier dans un memcpy Buffer C++
- 6. Performance: Affectation variable unique vs ObjectGraph Navigation (Java)
- 7. Moniteur vs Mutex en C#
- 8. TCPClient vs Socket en C#
- 9. GetWindowLong vs GetWindowLongPtr en C#
- 10. Déclaration de tableau C et affectation?
- 11. Affectation des objets gérés dans C++ géré
- 12. Affectation un entier en pointeur sans transtypage
- 13. sérialisation XML vs réflexion en C#
- 14. producteur-consommateur utilisant affectation
- 15. Affectation JavaScript
- 16. affectation de calcul dépendant LINQ
- 17. Java vs sortie C
- 18. UrlEncode - Javascript vs C#
- 19. C# Assembly.Load vs Assembly.ReflectionOnlyLoad
- 20. typedef'ing un tableau vs en utilisant une struct en C++
- 21. ANSI C: Affectation de tableaux et de pointeurs aux tableaux
- 22. C# Affectation propriété par défaut pour la classe et l'opérateur =
- 23. Affectation de vector :: iterator à un tableau de tableau de caractères VS 2003
- 24. Affectation des valeurs aux variables d'instance dans l'objectif C
- 25. Performances C# pour serveur proxy (vs C++)
- 26. Affectation parallèle et plages
- 27. C#: Cette affectation de zone est-elle sûre?
- 28. Affectation de données via une fonction (ANSI C)
- 29. Affectation des trames HTML
- 30. memcpy ne pas faire comme il est censé
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
Cette question est assez large. –