我正在重新編寫一個任務,使它完全免費分配。目標是在應用程序的啓動階段完成後有0個集合。Ascii Bytes Array To Int32或Double
此前,有很多這樣的電話:
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#庫函數在一個更優化的方式,已經這樣做了嗎?或者是讓上述運行速度更快的一種改進(可能會在白天被稱爲數百萬次)。謝謝!
如果有一件事使得託管代碼優於傳統代碼,那麼分配內存的成本非常低。有意避免它就像吹你的左腳去參加奧運比賽。 – 2010-03-26 12:26:54
分配內存很便宜;垃圾收集不是。創建大量的垃圾最終會將相對短暫的對象推到Gen2堆上,這通常是值得避免的。 – Gabe 2010-03-26 12:54:21
同意。我們正在努力減少收集。我們肯定會看到一些Gen2收藏需要長達100ms。這些短命的字符串並不是一個很大的問題,我猜,它們應該很快收集起來。但他們並不難去除。如果我們只說:在應用程序的連續運行階段沒有分配,它可以更容易地追蹤真正的重大分配來自哪裏。 – 2010-03-26 13:24:17