Est-ce que memcpy () est généralement plus rapide que strcpy ()?
Est memcpy() généralement plus rapide que la fonction strcpy() (sur la plupart des plates-formes)? (Je suppose que la taille de la chaîne est connue.)
Si je me souviens i386 assembler correctement, il y a la "boucle" commandes qui copie un nombre d'octets ou de mots. C'est donc le moyen le plus rapide, tandis que la fonction strcpy() i386 assembleur de la mise en œuvre serait d'utiliser le manuel de contrôle pour le '\0' dans une simple boucle.
Si j'ai l'impression que sur x86 memcpy() est plus rapide que la fonction strcpy().
Ce qui est sur d'autres architectures?
source d'informationauteur porton
Vous devez vous connecter pour publier un commentaire.
Si vous connaissez la taille des données à copier, puis
memcpy()
devrait être aussi rapide ou plus rapide questrcpy()
. Sinon,memcpy()
ne peut pas être utilisé seul, etstrcpy()
devrait être aussi rapide ou plus rapide questrlen()
suivie parmemcpy()
.Cependant...
Beaucoup de mises en œuvre de
memcpy()
et/oustrcpy()
et/oustrlen()
sont conçus pour manipuler efficacement de grandes quantités de données. Cela signifie souvent de démarrage supplémentaires, les frais généraux (par exemple, la détermination de l'alignement, le réglage de la SIMD, gestion du cache, etc) et fait de ces implémentations mauvais (lent) pour la copie de petites quantités de données (ce qui est beaucoup plus probable dans le code écrit). De ce fait, "devrait être aussi rapide ou plus rapide" n'implique pas nécessairement "est aussi rapide ou plus rapide". Par exemple, pour les petites quantités de données relatives à unememcpy()
optimisé pour les grandes quantités de données peuvent être beaucoup plus lent que d'unestrcpy()
qui n'était pas optimisé pour les grandes quantités de données.Noter également que le principal problème ici est que le code générique (par exemple,
memcpy()
etstrcpy()
) ne peut pas être optimisé pour un cas spécifique. La meilleure solution aurait été d'avoir des fonctions multiples - par exemplememcpy_small()
optimisé pour la copie de petites quantités de données etmemcpy_large()
optimisé pour mauvais code que l'échec d'éviter de copier une grande quantité de données.Sur presque n'importe quelle plateforme,
memcpy()
va être plus rapide questrcpy()
lors de la copie du même nombre d'octets. La seule foisstrcpy()
ou l'un de ses "safe" équivalents serait mieux que lesmemcpy()
serait lorsque la taille maximale d'une chaîne serait beaucoup plus grand que sa taille réelle. Si l'on dispose d'une mémoire tampon qui pourrait contenir une chaîne de jusqu'à un million de caractères, et l'on veut copier la chaîne à l'autre en millions d'octets de la mémoire tampon,memcpy()
aurait pour copier un million d'octets, même si la chaîne de caractères dans le premier tampon était plus qu'à deux caractères. Lestrcpy()
fonction ou de ses équivalents, cependant, serait en mesure de sortie précoce, et prendrait probablement moins de temps pour copier les deux personnages quememcpy()
aurait besoin de copier un million de dollars.