fastCSharp 1.6 内存数据库引擎及代码生成实例 发布

showjim 2014-02-26 08:44:15
如果你的服务器有大量空闲内存,会不会有一种可耻的感觉呢?如果内存不够大,应该花点钱买买这种感觉。
大内存相比于硬盘,不仅仅是程序跑得更快,更重要的是有效利用大内存能让程序开发更快捷。长期来说,节省的开发人工成本,相比于内存价格还是很划算的。
看看现在市面上出现了各种各样的内存数据库,忍不住凑了个热闹。花了一些时间写了个可嵌入的内存数据库物理引擎,以及代码生成实例。由于本人与C#版主caozhy有过不愉快,所以发到这个版块来了。

1.支持嵌入模式,也就是可以不需要服务端,直接本地函数调用。
2.支持代码生成模式与反射模式,反射模式序列化性能相比于代码生成模式可能相差2倍以上。
3.序列化采用二进制序列化,添加成员识别的二进制序列化性能相差在40%以下。
4.客户端在通讯层实现了并发请求合并处理

以往的代码生成实例一样,采用自定义属性配置环境参数,比如
[fastCSharp.setup.cSharp.memoryDatabase(CacheType = typeof(fastCSharp.memoryDatabase.cache.identityArray<,>), FileName = null, MinRefreshSize = 1, ClientType = typeof(fastCSharp.memoryDatabase.physicalClient<identity>), IsEmbed = false, IsIndexSerialize = true)]
对于代码生成模式,数据库操作代理就是 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 fastCSharp.memoryDatabase.PhysicalClient<identity>(), new fastCSharp.memoryDatabase.cache.identityArray<identity>()));
性能测试,采用的数据定义如下
        public abstract class data
{
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;
}
当成员String为null的时候,二进制序列化数据大概120+字节,成员识别二进制序列化数据大概350+字节。
采用10W对象数据为单位做写入测试,总数据量100W单线程循环10次。
对于远程模式分别测试了客户端单线程与多线程并发。
测试机 Inter(R) Celeron(R) M CPU 520 1.60GHz,测试耗时包括 物理层处理 + 网络通讯处理 + 客户端对象创建与序列化处理 + 简单的缓存同步更新操作。
代码生成模式+成员识别二进制序列化 [10W对象 + 序列化数据35M] 同步测试结果 / 异步测试结果
本地模式  1线程:平均耗时 0.7s,CPU 100%
远程模式 1线程:平均耗时 5.3s / 6.7s,CPU 100%
远程模式 2线程:平均耗时 3.4s / 5.5s,CPU 100%
远程模式 5线程:平均耗时 2.4s / 3.6s,CPU 100%
远程模式 10线程:平均耗时 2.1s / 2.6s,CPU 100%
远程模式 20线程:平均耗时 1.8s / 1.9s,CPU 100%
远程模式 25线程:平均耗时 1.8s / 1.9s,CPU 100%
远程模式 40线程:平均耗时 1.9s / 1.8s,CPU 100%
远程模式 50线程:平均耗时 2.2s / 1.8s,CPU 100%
远程模式 80线程:平均耗时 2.3s / 1.8s,CPU 100%
远程模式200线程:平均耗时 2.8s / 2.0s,CPU 100%
远程模式500线程:平均耗时 3.5s / 2.9s,CPU 100%
代码生成模式+普通二进制序列化 [10W对象 + 序列化数据12M] 同步测试结果
本地模式  1线程:平均耗时  0.53s,CPU 100%
远程模式 1线程:平均耗时 4.9s,CPU 100%
远程模式 2线程:平均耗时 3.1s,CPU 100%
远程模式 5线程:平均耗时 1.9s,CPU 100%
远程模式 10线程:平均耗时 1.5s,CPU 100%
远程模式 20线程:平均耗时 1.4s,CPU 100%
远程模式 25线程:平均耗时 1.4s,CPU 100%
远程模式 40线程:平均耗时 1.3s,CPU 100%
远程模式 50线程:平均耗时 1.3s,CPU 100%
远程模式 80线程:平均耗时 1.4s,CPU 100%
远程模式200线程:平均耗时 1.8s,CPU 100%
远程模式500线程:平均耗时 2.8s,CPU 100%
反射模式+成员识别二进制序列化 [10W对象 + 序列化数据35M] 同步测试结果
本地模式  1线程:平均耗时 2.9s,CPU 100%
远程模式 1线程:平均耗时 8.4s,CPU 100%
远程模式 20线程:平均耗时 4.3s,CPU 100%
远程模式 40线程:平均耗时 4.3s,CPU 100%
远程模式 80线程:平均耗时 4.6s,CPU 100%
反射模式+普通二进制序列化 [10W对象 + 序列化数据12M] 同步测试结果
本地模式  1线程:平均耗时  3.1s,CPU 100%
远程模式 1线程:平均耗时 8.4s,CPU 100%
远程模式 20线程:平均耗时 4.2s,CPU 100%
远程模式 40线程:平均耗时 4.2s,CPU 100%
远程模式 80线程:平均耗时 4.4s,CPU 100%
...全文
974 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪狐 2014-05-15
  • 打赏
  • 举报
回复
Mark一下,以备学习之用!
风一样的大叔 2014-02-28
  • 打赏
  • 举报
回复
我是来学习的
showjim 2014-02-26
  • 打赏
  • 举报
回复
补充说明:测试结果有点虚,我的本本0.7s可写不了35M数据,因为windows2003操作系统有硬盘写入缓冲,程序跑完了硬盘还要闪一阵。 而对于读取测试,可以手动清除操作系统硬盘缓存,我的本本读取35M数据需要2s。

17,747

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧