1

我正在重写库,其任务是使其完全免费分配。目标是在应用程序的启动阶段完成后拥有 0 个集合。

以前有很多这样的调用:

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

我相信这是分配一个字符串。我找不到可以自动执行相同操作的 C# 库函数。我查看了 BitConverter 类,但看起来只有当您的 Int32 使用代表它的实际字节进行编码时。在这里,我有一个字节数组,表示代表 Int32 的 Ascii 字符。

这就是我所做的

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# 库函数?或改进以使上述运行更快(可能在白天被调用数百万次)。谢谢!

4

1 回答 1

5

每天数百万次应该不是问题——我希望它能够每秒运行数十万次。就我个人而言,我会重写上面的内容,只在循环中声明“temp”(并去掉 Pascal-cases 局部变量名 - 呃),但这应该没问题。

该代码将更容易理解为:

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

这和你的一样

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

行,但以更简单的方式(IMO)。它们的行为方式应该完全相同。

一般来说,尝试在没有任何分配的情况下编写 C# 是非常苛刻的,并且与语言和框架的设计方式作斗争。您认为这实际上是一个合理的要求吗?诚然,我听说有些游戏是用托管代码编写的……但这似乎有点奇怪。

当然,如果字节不合适,您将分配一个异常......

编辑:请注意,您的代码不允许使用负数。可以吗?

于 2010-03-26T12:27:31.173 回答