gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:27:48 25 4
gpt4 key购买 nike

背景:

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

在 CLR Profiler 下的一次运行中,一些短时间(分析器外 3-5 秒的 CPU 时间)产生了超过 1 GB 的垃圾,其中大部分是 byte[] 分配,这触发了 500 多次收集。

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

显然需要重写。

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

像这样的……

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

问题:

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

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

我知道我可以替换“return 0;”使用“Pool.deAllocate(temp); return 0”,但我试图强制进行恢复。

这有可能吗?

最佳答案

您可以实现一个 Buffer 类,它实现了 IDisposable 并在处理完缓冲区后将其返回到池中。然后您可以授予对底层字节数组的访问权限,并且只要每个人都玩得很好您就可以利用重用。

不过请注意:

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

我实际上在 MiscUtil 中有一些代码要做到这一点 - 请参阅 CachingBufferManagerCachedBuffer 等。请注意,我不能说我经常使用它……根据我的内存,我做到了比我真正需要的要复杂一点......

编辑:回应评论...

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

关于c# - 如何实现我自己的字节数组创建和处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1452096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com