我有一个应用程序为了性能方面的原因在内存中保存了大量实例,而我不想想将其写入到磁盘或任何其他把它放在内存中。优化具有大量实例的.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