【发布时间】:2010-07-17 09:57:37
【问题描述】:
出于性能原因,我有一个应用程序将大量实例保存在内存中,我不想将其写入磁盘或任何其他地方,只需将其全部保存在内存中.
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; }
}
// ...
理论上,使用这种方法我实际上可以减少内存占用,但实际上,正如您所看到的,这种方法的问题是它会导致所有情况下的笛卡尔积具有更小和省略的字段,丑陋和大代码可以'以后写完就不再维护了。
另一个关于字符串的想法:
.NET 应用程序中的所有字符串都以 UTF-16 编码表示。如果我只能让它以 UTF-8 编码,它将减少 x2 倍的字符串使用的内存。
【问题讨论】:
-
描述有点模糊。您能否更详细地解释您的方案是什么?你的应用程序在做什么?为什么需要使用这么多内存?
-
所有对象都是唯一的还是有很多重复项(包含相同数据的单独实例)?
-
@DxCK “名称”的值是唯一的,还是有很多重复的实例? “姓名”代表什么?
-
顺便说一句。字符串在 .NET 中实习,en.wikipedia.org/wiki/String_interning
-
@Chris 如果它们是在运行时创建的,则不会。
标签: c# .net performance optimization memory