Le moyen le plus rapide de convertir int à 4 octets en C #
Ce qui est un moyen le plus rapide pour convertir int de 4 octets en C# ?
Plus rapide que dans les temps d'exécution des pas de temps de développement.
Ma propre solution de ce code:
byte[] bytes = new byte[4];
unchecked
{
bytes[0] = (byte)(data >> 24);
bytes[1] = (byte)(data >> 16);
bytes[2] = (byte)(data >> 8);
bytes[3] = (byte)(data);
}
Droit maintenant, je vois que ma solution surpasse struct
et BitConverter
par couple de tiques.
Je pense que l'insécurité est probablement l'option la plus rapide et accepter que comme une réponse, mais je préfère utiliser un gérés option.
source d'informationauteur MichaelT | 2012-01-11
Vous devez vous connecter pour publier un commentaire.
Un octet* fonte en utilisant le code unsafe est de loin la plus rapide:
C'est ce que BitConverter n'ainsi, ce code permet d'éviter le coût de la création du tableau.
À l'aide d'un BitConverter et c'est GetBytes surcharge qui prend un entier de 32 bits:
J'ai fait une recherche sur le temps nécessaire pour sérialiser un type de base de tableau d'octets. Je l'ai fait pour le cas où vous disposez déjà d'un tableau et de l'offset où vous voulez mettre vos données. Je suppose que c'est vraiment une affaire importante par rapport à la théorie de l'obtenir un tableau de 4 octets parce que quand vous êtes à la sérialisation de quelque chose, alors c'est exactement ce dont vous avez besoin. J'ai compris que la réponse à quelle méthode est plus rapide dépend de ce que vous voulez de sérialiser. J'ai essayé quelques méthodes:
m_Bytes[offset] = (byte)(value >> 8)
m_Bytes[offset] = (byte)((i >> 8) & 0xFF)
J'ai couru tous les test de 10 millions de fois. Ci-dessous sont les résultats en millisecondes
Comme vous pouvez le voir le dangereux chemin est beaucoup plus rapide pour une longue et double (unsigned versions sont environ les mêmes que les versions signées de sorte qu'ils ne sont pas dans le tableau). Pour faire court/int/float le moyen le plus rapide est le 2/4/4 affectations avec la touche shift. Pour l'octet le plus rapide est évidemment la simple affectation. Donc en ce qui concerne la question de départ, - l'affectation est le meilleur. C'est l'exemple d'une telle fonction dans une manière la plus rapide:
P. S. Les tests ont été exécutés sur x64 environnement avec le code compilé pour cpu tout (ce qui était x64 sur exécuter) en mode release.
Le moyen le plus rapide est une structure contenant 4 octets.
Nettement plus rapide que le BitConverter.
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx
dispose de l'attribut.
Note le BitConverter peut-être pas la plus rapide dans le test ci-dessous.
Utiliser le
BitConverter
classe, plus précisément leGetBytes
méthode qui prend unInt32
paramètre:Vous pouvez utiliser
BitConverter.IsLittlEndian
pour déterminer l'ordre des octets basé sur l'architecture du PROCESSEUR.EDIT: Le test ci-dessous n'est pas concluante en raison optimisations du compilateur.
Comme beaucoup ici semblent argumenter sur si
BitConverter
est beter que l'un dédiéstruct
. Basé sur la BCL le code source de laBitConverter.GetBytes()
ressemble à ceci:Qui, de mon point de vue est plus propre et semble plus rapide que de faire 1 entier + 4 octets affectations à une explicite struct que celui-ci.
En moyenne autour de 2770ms sur ma machine alors que
En moyenne autour de 4510ms.
Je pense que cela pourrait être la façon la plus rapide en C#. (avec tableau d'octets initialisé à 4x int stream w/int32