首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现我自己的字节数组创建和处理

如何实现我自己的字节数组创建和处理
EN

Stack Overflow用户
提问于 2009-09-20 21:41:43
回答 1查看 2.8K关注 0票数 5

背景:

在通过分析器运行我的应用程序时,似乎所有的热点都涉及到分配大量临时的新byte[]数组。

在CLR下的一次运行中,几个短的CPU时间(在分析器外的CPU时间为3-5秒)产生于一个千兆字节的垃圾上,其中大部分是byte[]分配,这就触发了500多个收集。

在某些情况下,应用程序似乎花费了10%以上的CPU时间来执行集合。

很明显,重写是有序的。

因此,我正在考虑用一个池类替换新的byte[]分配,这样可以在以后重用缓冲区。

就像这样..。

代码语言:javascript
复制
{
 byte[] temp = Pool.AllocateBuffer(1024);
 ...
 }

问题:

当不再需要临时程序时,如何强制应用程序调用例程Pool.deAllocate( temp )中的代码。

在上面的代码片段中,当temp是一个池分配的byte[]缓冲区时,但是当它超出作用域时,它就会被删除。不是真正的问题,但不会被泳池重复使用。

我知道可以将“返回0”替换为“Pool.deAllocate(临时);返回0",但我试图强制恢复。

这根本不可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-20 21:49:34

您可以实现一个Buffer类,该类实现IDisposable,并在释放缓冲区时将其返回给池。然后,您可以提供对底层字节数组的访问,只要每个人都玩得很好,就可以利用重用。

不过,请注意:

  • 您的缓冲区将很快结束于第2代,这可能是不理想的,因为其他原因。
  • 如果恶意代码段保留了对字节数组的引用,则它们可能监视其他代码使用的数据。
  • 您需要记住在正确的时间处理缓冲区。

实际上,我在MiscUtil中有一些代码可以这样做--参见CachingBufferManagerCachedBuffer等。我不能说我用过很多,请注意……据我所知,我把事情弄得比我真正需要的要复杂一些.

编辑:回复评论.

  • 不能强迫应用程序代码释放缓冲区,不行。在C#中没有自动发布机制-- using语句是我们得到的最接近的语句。
  • 可以在缓冲区类中实现对byte[]的隐式转换,以便调用具有字节数组参数的方法。就我个人而言,我不太喜欢隐式转换,但它当然可以作为一种选择。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1452096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档