.NetCore 中的 ArrayPool 是什么 - C#

Rob*_*ste 9 c# .net-core

我正在阅读官方的ASP.NET Core 性能最佳实践文档。

为了提高性能,他们推荐使用ArrayPool来存储大型数组。

但是,什么是 ArrayPool 以及它是如何工作的?查看互联网和官方文档并不能帮助我理解它是如何工作的以及我应该在什么情况下使用它。

use*_*290 8

添加到现有答案:

请记住,使用ArrayPool而不是分配 withnew会将释放内存的责任交给您。如果您不保证调用 Return 方法,您的应用程序不会泄漏内存,但会ArrayPool阻止重用内存,从而否定您从使用ArrayPool.

在创建缓冲区并以相同方法释放它的简单用例中,将其放入 finally 子句是有意义的:

private static void LocalUseOfSharedPool(int i)
{
    int[] arr = ArrayPool<int>.Shared.Rent(ARRAYSIZE);
    try
    {
        ShowAddress($"simple array {i}", arr);
        FillTheArray(arr);
        UseTheArray(arr);
    }
    finally
    {
        ArrayPool<int>.Shared.Return(arr);
    }
}
Run Code Online (Sandbox Code Playgroud)

在更复杂的情况下,您必须确保不会以其他方式泄漏内存。

另请注意,您的缓冲区现在具有生命周期。如果将数组传递给另一个对象B,则需要确保该对象B在调用后没有使用该数组ArrayPool<>.Return

由于使用ArrayPool是一个性能问题,因此请衡量使用它的收益,特别是当您想要更改现有系统时。

  • 这并不完全正确。未能返回数组并不是致命错误。该数组将不会返回到池中,并且会像平常一样被垃圾收集。另一方面,返回一个数组,然后仍然继续使用它是一个致命错误。 (2认同)