我正在重新编写图书馆,其任务是完全免费分配。目标是在应用程序的启动阶段完成后拥有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#库函数已经以更优化的方式完成了这项工作?或者改进以使上述运行更快(可能在白天被称为数百万次)。谢谢!
答案 0 :(得分:5)
每天数百万次不应该成为问题 - 我希望每秒能够运行数十万次。我个人会重写上面的内容,只在循环中声明“temp”(并删除Pascal案例的局部变量名称 - urgh),但它应该没问题。
代码可以更直接地理解为:
int digit = bytes[i] - '0';
与您的
相同Temp = ((Int32)bytes[i]) - 48;
行,但以更简单的方式(IMO)。它们的行为应该完全相同。
总的来说,尝试编写C#而不进行任何分配是相当苛刻的,并且与语言和框架的设计方式相抗衡。你认为这实际上是一个合理的要求吗?不可否认,我听说有些游戏是用托管代码编写的......但它确实有点奇怪。
当然,如果字节不合适,你将分配一个例外......
编辑:请注意,您的代码不允许使用负数。那可以吗?