背景:
在通过分析器运行我的应用程序时,似乎所有的热点都涉及到分配大量临时的新byte[]数组。
在CLR下的一次运行中,几个短的CPU时间(在分析器外的CPU时间为3-5秒)产生于一个千兆字节的垃圾上,其中大部分是byte[]分配,这就触发了500多个收集。
在某些情况下,应用程序似乎花费了10%以上的CPU时间来执行集合。
很明显,重写是有序的。
因此,我正在考虑用一个池类替换新的byte[]分配,这样可以在以后重用缓冲区。
就像这样..。
{
byte[] temp = Pool.AllocateBuffer(1024);
...
}问题:
当不再需要临时程序时,如何强制应用程序调用例程Pool.deAllocate( temp )中的代码。
在上面的代码片段中,当temp是一个池分配的byte[]缓冲区时,但是当它超出作用域时,它就会被删除。不是真正的问题,但不会被泳池重复使用。
我知道可以将“返回0”替换为“Pool.deAllocate(临时);返回0",但我试图强制恢复。
这根本不可能吗?
发布于 2009-09-20 21:49:34
您可以实现一个Buffer类,该类实现IDisposable,并在释放缓冲区时将其返回给池。然后,您可以提供对底层字节数组的访问,只要每个人都玩得很好,就可以利用重用。
不过,请注意:
实际上,我在MiscUtil中有一些代码可以这样做--参见CachingBufferManager,CachedBuffer等。我不能说我用过很多,请注意……据我所知,我把事情弄得比我真正需要的要复杂一些.
编辑:回复评论.
using语句是我们得到的最接近的语句。byte[]的隐式转换,以便调用具有字节数组参数的方法。就我个人而言,我不太喜欢隐式转换,但它当然可以作为一种选择。https://stackoverflow.com/questions/1452096
复制相似问题