代码之家  ›  专栏  ›  技术社区  ›  Noah

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

  •  5
  • Noah  · 技术社区  · 17 年前

    背景:

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

    在一次在clr profiler下运行时,在一个gigabyte的垃圾上产生了几秒(相当于profiler外CPU时间的3-5秒)的时间,其中大部分是字节[]的分配,这触发了500多个收集。

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

    显然,重写是正确的。

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

    像这样的…

    {
     byte[] temp = Pool.AllocateBuffer(1024);
     ...
     }
    

    问题:

    如何强制应用程序在不再需要temp时调用例程池中的代码。释放(temp)。

    在上面的代码片段中,当temp是池分配的byte[]缓冲区,但当它超出范围时,它会被删除。不是真正的问题,但不会被池重用。

    我知道我可以用“pool.deallocate(temp);return 0”替换“return 0”;但我正试图强制恢复。

    这是不是可能的?

    1 回复  |  直到 17 年前
        1
  •  4
  •   Jon Skeet    17 年前

    您可以实现 Buffer 实现的类 IDisposable 并在释放缓冲区时将其返回到池。然后,您可以授予对底层字节数组的访问权,以及 只要每个人都表现出色 您可以利用重用。

    但要注意:

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

    我实际上有一些代码 MiscUtil 为此-请参见 CachingBufferManager , CachedBuffer 等等,我不能说我用得太多了,介意你……根据我的记忆,我做的比我真正需要的要复杂一些…

    编辑:响应评论…

    • 你不能 力 用于释放缓冲区的应用程序代码,不。C-A中没有自动释放机制 using 声明是我们最接近的。
    • 可以实现到的隐式转换 byte[] 在缓冲区类中,允许您调用具有字节数组参数的方法。就我个人而言,我不太喜欢隐式转换,但它当然可以作为一种选择。