我有一個應用程序爲了性能方面的原因在內存中保存了大量實例,而我不想想將其寫入到磁盤或任何其他把它放在內存中。優化具有大量實例的.NET應用程序的內存佔用量
public class MyObject
{
public string Name;
public object Tag;
public DateTime DateTime1;
public DateTime DateTime2;
public DateTime DateTime3;
public long Num1;
public uint Num2;
public uint Num3;
public ushort Num4;
}
在很多情況下,我實際上並沒有使用所有的字段,也沒有充分利用字段的整體大小。所以我想也許把這個整個類轉移到一個帶有屬性的接口中,並創建許多實現類,以不同的方式存儲數據:使用較小的字段(例如int而不是long)並省略一些未使用的字段。
例如:
public interface IMyObject
{
string Name { get; set; }
object Tag { get; set; }
DateTime DateTime1 { get; set; }
DateTime DateTime2 { get; set; }
DateTime DateTime3 { get; set; }
long Num1 { get; set; }
uint Num2 { get; set; }
uint Num3 { get; set; }
ushort Num4 { get; set; }
}
public class MyObject1 : IMyObject
{
public string Name { get; set; }
public object Tag { get; set; }
public DateTime DateTime1 { get; set; }
public DateTime DateTime2 { get; set; }
public DateTime DateTime3 { get; set; }
public long Num1 { get; set; }
public uint Num2 { get; set; }
public uint Num3 { get; set; }
public ushort Num4 { get; set; }
}
public class MyObject2 : IMyObject
{
private int _num1;
public string Name { get; set; }
public object Tag { get; set; }
public DateTime DateTime1 { get; set; }
public DateTime DateTime2 { get; set; }
public DateTime DateTime3 { get; set; }
public long Num1
{
get { return _num1; }
set { _num1 = (int)value; }
}
public uint Num2 { get; set; }
public uint Num3 { get; set; }
public ushort Num4 { get; set; }
}
public class MyObject3 : IMyObject
{
public string Name { get; set; }
public object Tag { get; set; }
public DateTime DateTime1
{
get { return DateTime.MinValue; }
set { throw new NotSupportedException(); }
}
public DateTime DateTime2 { get; set; }
public DateTime DateTime3 { get; set; }
public long Num1 { get; set; }
public uint Num2 { get; set; }
public uint Num3 { get; set; }
public ushort Num4 { get; set; }
}
// ...
從理論上講,這種方法其實我可以減少內存佔用量,但實際上你看,這種做法的問題是,它會導致與較小的所有病例笛卡爾乘積省略了字段,以後編寫後不能維護的醜陋和大代碼。
約琴絃另一種思考:
在UTF-16編碼表示的.NET應用程序的所有字符串。如果我只能使它以UTF-8編碼,它會減少字符串使用的內存的x2倍。
這是有點含糊不清說明。你能否更詳細地解釋你的情況?你的應用程序在做什麼?爲什麼它需要使用那麼多的內存? – 2010-07-17 10:02:24
所有對象都是唯一的還是有很多重複項(包含相同數據的單獨實例)? – 2010-07-17 10:03:37
沒有重複。 – DxCK 2010-07-17 10:05:54