您可以将使用这些临时数组的代码包装在 using 语句中,如下所示:
using(double[] scratchArray = new double[buffer])
{
// Code here...
}
这将通过在 using 语句末尾调用析构函数来显式释放内存。
不幸的是,上面的内容似乎不正确!取而代之的是,您可以尝试使用帮助函数返回适当大小的数组(大于大小的 2 的最接近幂),如果它不存在,则创建它。这样,您将只有对数个数组。如果您希望它是线程安全的,尽管您需要遇到更多麻烦。
它可能看起来像这样:(使用算法中的 pow2roundup 来查找大于或等于给定值的 2 的最小幂)
private static Dictionary<int,double[]> scratchArrays = new Dictionary<int,double[]>();
/// Round up to next higher power of 2 (return x if it's already a power of 2).
public static int Pow2RoundUp (int x)
{
if (x < 0)
return 0;
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x+1;
}
private static double[] GetScratchArray(int size)
{
int pow2 = Pow2RoundUp(size);
if (!scratchArrays.ContainsKey(pow2))
{
scratchArrays.Add(pow2, new double[pow2]);
}
return scratchArrays[pow2];
}
编辑:线程安全版本:这仍然会有垃圾收集的东西,但它将是特定于线程的,并且开销应该少得多。
[ThreadStatic]
private static Dictionary<int,double[]> _scratchArrays;
private static Dictionary<int,double[]> scratchArrays
{
get
{
if (_scratchArrays == null)
{
_scratchArrays = new Dictionary<int,double[]>();
}
return _scratchArrays;
}
}
/// Round up to next higher power of 2 (return x if it's already a power of 2).
public static int Pow2RoundUp (int x)
{
if (x < 0)
return 0;
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x+1;
}
private static double[] GetScratchArray(int size)
{
int pow2 = Pow2RoundUp(size);
if (!scratchArrays.ContainsKey(pow2))
{
scratchArrays.Add(pow2, new double[pow2]);
}
return scratchArrays[pow2];
}