Вопрос

Я переписываю библиотеку с просьбой сделать ее полностью бесплатной.Цель – получить 0 коллекций после завершения этапа запуска приложения.

Раньше было много таких звонков:

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

Я считаю, что это выделение строки.Я не смог найти библиотечную функцию C#, которая автоматически делала бы то же самое.Я посмотрел на класс BitConverter, но похоже, что это происходит только в том случае, если ваш Int32 закодирован фактическими байтами, которые его представляют.Здесь у меня есть массив байтов, представляющих символы Ascii, которые представляют Int32.

Вот что я сделал

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;
}

Кто-нибудь знает библиотечную функцию C#, которая уже делает это более оптимальным способом?Или улучшение, позволяющее ускорить выполнение вышеописанного (вероятно, оно будет вызываться миллионы раз в течение дня).Спасибо!

Это было полезно?

Решение

Миллионы раз в день не должно быть проблемой — я ожидаю, что это сможет выполняться сотни тысяч раз в секунду.Лично я бы переписал вышеприведенное, чтобы объявлять «temp» только внутри цикла (и избавиться от имен локальных переменных в Pascal-cases - ура), но все должно быть в порядке.

Код будет более понятен как:

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

который делает то же самое, что и ваш

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

линия, но более простым способом (ИМО).Они должны вести себя точно так же.

В общем, попытка написать C# без каких-либо выделений — это довольно жестко и противоречит тому, как спроектирован язык и платформа.Вы верите, что это на самом деле разумное требование?Признаюсь, я слышал, что некоторые игры пишутся с использованием управляемого кода...но это кажется немного странным.

Конечно, вы собираетесь выделить исключение, если байты неподходящие...

РЕДАКТИРОВАТЬ:Обратите внимание, что ваш код не допускает отрицательных чисел.Все хорошо?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top