Question

Je réécrivant alibrary a pour mandat de rendre totalement l'attribution gratuite. Le but est d'avoir 0 collections après est fait la phase de démarrage de l'application.

Auparavant, il y avait beaucoup d'appels comme celui-ci:

Int32 foo = Int32.Parse(ASCIIEncoding.ASCII.GetString(bytes, start, length));

Ce que je crois alloue une chaîne. Je ne pouvais pas trouver une fonction de bibliothèque C # qui ferait automatiquement la même chose. Je regardais la classe BitConverter, mais il semble que c'est que si votre Int32 est codé avec les octets réels qui la représentent. Ici, j'ai un tableau d'octets représentant des caractères ASCII qui représentent un Int32.

Voici ce que je l'ai fait

public static Int32 AsciiBytesToInt32(byte[] bytes, int start, int length)
{
     Int32 Temp = 0;
     Int32 Result = 0;
     Int32 j = 1;

     for (int i = start + length - 1; i >= start; i--)
     {
          Temp = ((Int32)bytes[i]) - 48;

          if (Temp < 0 || Temp > 9)
          {
               throw new Exception("Bytes In AsciiBytesToInt32 Are Not An Int32");
          }

          Result += Temp * j;
          j *= 10;
     }

     return Result;
}

Quelqu'un sait-il d'une fonction de bibliothèque C # qui fait déjà d'une manière plus optimale? Ou une amélioration pour rendre la course plus rapide au-dessus de (sa va appeler des millions de fois au cours de la journée probablement). Merci!

Était-ce utile?

La solution

Des millions de fois par jour ne devrait pas être un problème - je pense que, pour être en mesure d'exécuter des centaines de milliers de fois par seconde. Personnellement, je réécris ci-dessus de ne déclarer « temp » dans la boucle (et se débarrasser des noms de variables locales Pascal-cas - urgh). Mais il devrait être correct

Le code serait plus immédiatement compréhensible:

int digit = bytes[i] - '0';

qui fait la même chose que votre

Temp = ((Int32)bytes[i]) - 48;
ligne

, mais d'une manière plus simple (OMI). Ils doivent se comporter de la même manière.

D'une manière générale, en essayant d'écrire C # sans aucune allocation est assez dure, et lutte contre la façon dont la langue et le cadre sont conçus. Croyez-vous que cela est en fait une exigence raisonnable? Il est vrai que je l'ai entendu à ce sujet étant la façon dont certains jeux sont écrits en code managé ... mais il ne semble un peu bizarre.

Bien sûr, vous allez attribuer une exception si les octets sont inappropriés ...

EDIT: Notez que votre code ne permet pas de nombres négatifs. Est-ce que ça va?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top