【发布时间】:2010-03-26 12:21:12
【问题描述】:
我正在重写库,以使其完全免费分配。目标是在应用启动阶段完成后拥有 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# 库函数已经以更优化的方式做到了这一点?或改进以使上述运行更快(它可能会在白天被调用数百万次)。谢谢!
【问题讨论】:
-
如果说托管代码优于传统代码的原因之一就是分配内存的非常成本。刻意避免它就像是为了参加奥运会而左脚摔倒一样。
-
分配内存很便宜;垃圾收集不是。创建大量垃圾最终可能会将相对短命的对象推入 Gen2 堆,这通常是值得避免的。
-
同意。我们正在努力减少收藏。我们肯定会看到一些需要 100 毫秒的 Gen2 集合。我猜这些短命的字符串不是一个大问题,它们应该很快被收集起来。但它们并不难去除。如果我们只是说:在应用程序的持续运行阶段没有分配,它可以更容易地追踪真正的大量分配来自哪里。