Array.Copy y Buffer.BlockCopy font tous deux la même chose, mais BlockCopy
est destiné à la copie rapide de tableaux primitifs au niveau de l'octet, alors que Copy
est l'implémentation à usage général. Ma question est la suivante : dans quelles circonstances devriez-vous utiliser BlockCopy
? Devriez-vous l'utiliser à tout moment lorsque vous copiez des tableaux de type primitif, ou ne devriez-vous l'utiliser que si vous codez pour la performance ? Y a-t-il un danger inhérent à l'utilisation de Buffer.BlockCopy
sur Array.Copy
?
C'est une bonne idée. Avez-vous déjà rencontré des problèmes avec l'endianness ?
3 votes
N'oubliez pas
Marshal.Copy
:-) . UtilisezArray.Copy
pour les types de référence, les types de valeurs complexes et si le type ne change pas,Buffer.BlockCopy
pour la "conversion" entre les types de valeurs, les tableaux d'octets et la magie des octets. Par exemple, la combinaison avecStructLayout
est assez puissant si vous savez ce que vous faites. En ce qui concerne les performances, il semble qu'un appel non géré àmemcpy
/cpblk
est le plus rapide pour cela - voir code4k.blogspot.nl/2010/10/ .1 votes
J'ai fait quelques tests de référence avec
byte[]
. Il n'y avait aucune différence dans la version Release. Parfois,Array.Copy
parfoisBuffer.BlockCopy
(légèrement) plus rapide.0 votes
Une nouvelle réponse complète vient d'être postée ci-dessous. Notez que dans les cas où la taille du tampon est faible, la copie explicite de la boucle est généralement préférable.
0 votes
Je ne pense pas qu'ils fassent toujours la même chose - vous ne pouvez pas utiliser Array.Copy pour copier un tableau d'Ints vers un tableau d'Octets par exemple.
0 votes
Array.Copy
est plutôt une version spécialisée -- par exemple, elle ne peut copier que les tableaux de même rang.0 votes
Jon Skeet utilise Buffer.BlockCopy. Cela le rend plus rapide. Pas besoin d'analyse comparative :-)
0 votes
Est-ce que Span<T> a changé quelque chose dans la performance ?