如果你的服务器有大量空闲内存,会不会有一种可耻的感觉呢?如果内存不够大,应该花点钱买买这种感觉。
大内存相比于硬盘,不仅仅是程序跑得更快,更重要的是有效利用大内存能让程序开发更快捷。长期来说,节省的开发人工成本,相比于内存价格还是很划算的。
看看现在市面上出现了各种各样的内存数据库,忍不住凑了个热闹。花了几天时间写了个可嵌入的内存数据库物理引擎,以及代码生成实例。codeplex连不上,连续提交3个小时了,只好上传到了51nod。
1.支持嵌入模式,也就是可以不需要服务端,直接本地函数调用。
2.支持代码生成模式与反射模式,反射模式序列化性能相比于代码生成模式可能相差4倍以上。
3.序列化现在支持二进制与JSON两种模式。因为二进制序列化不能识别成员变化,只能用于稳定的类型定义,所以暂时采用JSON序列化弥补,以后有时间在增加一个专用的序列化程序。代码生成模式中JSON序列化性能相比于二进制序列化可能相差2倍以上,序列化生成的数据量也可能相差3倍以上。
和以往的代码生成实例一样,采用自定义属性配置环境参数,比如
[fastCSharp.setup.cSharp.memoryDatabase(CacheType = typeof(fastCSharp.memoryDatabase.cache.identityArray<,>), FileName = null, MinRefreshSize = 1, MaxLogCacheSize = 0, ClientPoolType = typeof(clientPool), IsEmbed = false, IsJsonSerialize = false)]对于代码生成模式,数据库操作代理就是 Model.memoryDatabase.Default,比如
private static memoryDatabase db = memoryDatabase.Default;对于反射模式,数据库操作代理需要自己创建。嵌入模式与远程模式的数据库代理分别如下
private static fastCSharp.setup.cSharp.memoryDatabase.localTable<identity, int> db = fastCSharp.setup.cSharp.memoryDatabase.table.Open(new setup.cSharp.memoryDatabase.localTable<identity, int>(new fastCSharp.memoryDatabase.cache.identityArray<identity>()));
private static fastCSharp.setup.cSharp.memoryDatabase.remoteTable<identity, int> db = fastCSharp.setup.cSharp.memoryDatabase.table.Open(new setup.cSharp.memoryDatabase.remoteTable<identity, int>(new clientPool(), new fastCSharp.memoryDatabase.cache.identityArray<identity>()));性能测试,采用的数据定义如下
public abstract class data当成员String为null的时候,二进制序列化数据大概120+字节,Unicode编码的JSON序列化数据大概580+字节。
{
public bool Bool;
public byte Byte;
public sbyte SByte;
public short Short;
public ushort UShort;
public int Int;
public uint UInt;
public long Long;
public ulong ULong;
public DateTime DateTime;
public float Float;
public double Double;
public decimal Decimal;
public Guid Guid;
public char Char;
public string String;
public bool? BoolNull;
public byte? ByteNull;
public sbyte? SByteNull;
public short? ShortNull;
public ushort? UShortNull;
public int? IntNull;
public uint? UIntNull;
public long? LongNull;
public ulong? ULongNull;
public DateTime? DateTimeNull;
public float? FloatNull;
public double? DoubleNull;
public decimal? DecimalNull;
public Guid? GuidNull;
public char? CharNull;
}
嵌入模式 与 远程模式+缓存模式[缓存模式相当于批量处理] 采用10W对象数据为单位做写入测试,远程模式采用1W对象数据为单位做写入测试。数据库操作代理采用单线程循环模式进行单机测试,测试机 Inter(R) Celeron(R) M CPU 520 1.60GHz,测试耗时包括 物理层处理 + 网络通讯处理 + 客户端对象创建与序列化处理。
代码生成模式(要求性能的选择)测试结果