Moyen plus rapide pour échanger endianness en C# avec 16 bits de mots
Il y a obtenu d'être plus rapide et de meilleure façon de swap d'octets de 16 bits de mots, puis ce.:
public static void Swap(byte[] data)
{
for (int i = 0; i < data.Length; i += 2)
{
byte b = data[i];
data[i] = data[i + 1];
data[i + 1] = b;
}
}
Quelqu'un a une idée?
Votre solution me semble une bonne sauf que SI VOS DONNÉES EST TOUJOURS ÊTRE IMPAIR-LENGTHED, votre code jeter tableau de lié exception.
Si il est la permutation de 16 bits de mots, ses données n'auront jamais de longueur impaire.
Oui, ce sera une méthode privée et il sera la garantie d'avoir des mots de 16 bits.
Pourquoi cherchez-vous vite et mieux? Est-il une métrique que vous visez?
c'est un O(n) de la solution, en l'absence de nouveau des allocations de mémoire. Puis d'autres déclarant b à l'extérieur de la boucle de sorte qu'il ne sera pas alloué à chaque fois, pourquoi voulez-vous améliorer?
Si il est la permutation de 16 bits de mots, ses données n'auront jamais de longueur impaire.
Oui, ce sera une méthode privée et il sera la garantie d'avoir des mots de 16 bits.
Pourquoi cherchez-vous vite et mieux? Est-il une métrique que vous visez?
c'est un O(n) de la solution, en l'absence de nouveau des allocations de mémoire. Puis d'autres déclarant b à l'extérieur de la boucle de sorte qu'il ne sera pas alloué à chaque fois, pourquoi voulez-vous améliorer?
OriginalL'auteur initialZero | 2009-10-23
Vous devez vous connecter pour publier un commentaire.
Dans ma tentative d'appliquer pour la Uberhacker prix, j'soumettre ce qui suit. Pour mes tests, j'ai utilisé un tableau Source de 8192 octets et appelé
SwapX2
100 000 fois:Mon analyse comparative indique que cette version est plus de 1,8 fois plus rapide que le code présenté dans la question d'origine.
OriginalL'auteur Brad
Cette voie semble être légèrement plus rapide que la méthode dans la question d'origine:
Mon analyse comparative suppose que la méthode est appelée à plusieurs reprises, de sorte que le redimensionnement de la
_temp
tableau n'est pas un facteur. Cette méthode repose sur le fait que la moitié de l'octet-échange peut être fait avec la premièreBuffer.BlockCopy(...)
appel (avec la position de la source compensée par 1).Veuillez indice de référence de l'-mêmes, dans les cas que j'ai complètement perdu mon esprit. Dans mes tests, cette méthode prend environ 70% tant que la méthode originale (que j'ai modifié pour déclarer la
byte b
à l'extérieur de la boucle).dans mon test, j'ai d'abord de la taille à la même taille que mon test de tableau, il n'y a pas de coût. Temp variables comme ceci permet en général d'acheter de la vitesse au détriment de la mémoire, ce qui peut ou peut ne pas être une bonne décision.
vous pouvez toujours set temp = null à la fin de swap pour réparer la fuite. C'est vraiment cool solution. Merci.
Pas de. Pas de. La fonction ne peut être appelée à partir de plusieurs threads.
Vous ne voulez pas savoir qu'une méthode d'échange n'est pas thread-safe. Cela va au cœur de ce qui est bon génie.
OriginalL'auteur MusiGenesis
J'ai toujours aimé ce:
Je crois que vous trouverez ce est la méthode la plus rapide ainsi un être assez lisible et coffre-fort. Évidemment, cela s'applique aux valeurs de 64 bits, mais la même technique pourrait être utilisée pour 32 ou 16.
OriginalL'auteur Jeff
Méthode suivante, dans mon test, presque 3 fois plus vite que l'on a accepté la réponse. (Toujours plus rapide sur plus de 3 caractères ou six octets, un peu plus lent, moins de ou égal à trois caractères ou six octets.) (Remarque que l'on a accepté la réponse peut lire/écrire en dehors des limites du tableau.)
(Mise à jour, Tout en ayant un pointeur il n'y a pas besoin d'appeler la propriété pour obtenir la longueur. En utilisant le pointeur est un peu plus rapide, mais nécessite soit un moment de l'exécution ou, comme dans l'exemple suivant, une configuration de projet à construire pour chaque plate-forme. Définir les architectures X86 et X64 sous chaque configuration.)
Cinq tests avec 300.000 fois 8192 octets
Cinq tests avec 50.000.000 fois sur 6 octets
Mais si les données sont grandes et la performance qui compte vraiment, vous pouvez utiliser de l'ESS ou AVX. (13 fois plus rapide.) https://pastebin.com/WaFk275U
D'essai 5 fois plus de 100000 boucles avec 8192 octets 4096 caractères
OriginalL'auteur Vozzie
Bien, vous pouvez utiliser le XOR permutation de truc, pour éviter un intermédiaire octet. Il ne sera pas plus vite, bien, et je ne serais pas surpris si la IL est exactement le même.
Ouais, je pense que tout ce que nous pouvons dire, c'est que c'est bien. J'ai juste comparé, et a obtenu des résultats identiques à votre solution. Ainsi, l'une des formes est susceptible optimisé pour l'autre.
OriginalL'auteur Michael Petrotta