你可以用使用論文在using語句這樣劃傷陣列代碼:
using(double[] scratchArray = new double[buffer])
{
// Code here...
}
這將通過調用在using語句的結束descructor明確地釋放內存。
不幸的是,看起來上面是不對的!代替這一點,你可以嘗試一些幫助函數,它返回一個合適大小的數組(最大冪次數大於2),如果它不存在,就創建它。這樣,你只有對數數組。如果你希望它是線程安全的,但你需要去更多的麻煩。
它可能看起來像這樣:(使用pow2roundup從Algorithm for finding the smallest power of two that's greater or equal to a given value)
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];
}
你真的意味着幾十千字節嗎?因爲這個數目非常小,所以我不用擔心內存管理... –
聽起來不是很多,但是如果我運行2000周/秒,突然它就像60MB /秒,並且GC開始注意到。 –
@JayLemmon,我認爲你出於性能原因關心這些細節,對吧?如果您的項目沒有完成,我建議您在完成之前不關心性能。請參閱本文[早熟優化](http://c2.com/cgi/wiki?PrematureOptimization)。如果項目完成,文章還會對__optimization__進行一些有趣的觀察。我引用了一個部分:「一個常見的誤解是,優化的代碼必然更復雜[...]更好的分解代碼通常運行速度更快,並且使用更少的內存[...]」。 – jay