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

showjim showjim 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如果你的服务器有大量空闲内存,会不会有一种可耻的感觉呢?如果内存不够大,应该花点钱买买这种感觉。
大内存相比于硬盘,不仅仅是程序跑得更快,更重要的是有效利用大内存能让程序开发更快捷。长期来说,节省的开发人工成本,相比于内存价格还是很划算的。
看看现在市面上出现了各种各样的内存数据库,忍不住凑了个热闹。花了几天时间写了个可嵌入的内存数据库物理引擎,以及代码生成实例。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
{
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+字节,Unicode编码的JSON序列化数据大概580+字节。
嵌入模式 与 远程模式+缓存模式[缓存模式相当于批量处理] 采用10W对象数据为单位做写入测试,远程模式采用1W对象数据为单位做写入测试。数据库操作代理采用单线程循环模式进行单机测试,测试机 Inter(R) Celeron(R) M CPU 520 1.60GHz,测试耗时包括 物理层处理 + 网络通讯处理 + 客户端对象创建与序列化处理。
代码生成模式(要求性能的选择)测试结果
本地模式二进制序列化:10W对象,序列化数据 12M+,平均耗时0.62s,CPU 100%(嵌入式的稳定类型选择)
远程缓存二进制序列化:10W对象,序列化数据 12M+,平均耗时 0.8s,CPU 100%(可靠性要求低的稳定类型选择)
远程模式二进制序列化: 1W对象,序列化数据1.2M+,平均耗时 0.8s,CPU 100%(要求可靠的稳定类型选择)
本地模式 JSON 序列化:10W对象,序列化数据 58M+,平均耗时 2s,CPU<100%[我的硬盘跟不上了](嵌入式的非稳定类型选择)
远程缓存 JSON 序列化:10W对象,序列化数据 58M+,平均耗时2.45s,CPU 100%(可靠性要求低的非稳定类型选择)
远程模式 JSON 序列化: 1W对象,序列化数据5.8M+,平均耗时1.05s,CPU 100%(要求可靠的非稳定类型选择)

反射模式(讨厌代码生成的选择)测试结果
本地模式二进制序列化:10W对象,序列化数据 12M+,平均耗时3.05s,CPU 100%
远程缓存二进制序列化:10W对象,序列化数据 12M+,平均耗时 3.2s,CPU 100%
远程模式二进制序列化: 1W对象,序列化数据1.2M+,平均耗时 1.2s,CPU 100%
本地模式 JSON 序列化:10W对象,序列化数据 58M+,平均耗时 4.6s,CPU 100%
远程缓存 JSON 序列化:10W对象,序列化数据 58M+,平均耗时 5s,CPU 100%
远程模式 JSON 序列化: 1W对象,序列化数据5.8M+,平均耗时1.35s,CPU 100%


后续有两个优化方向:一是抛弃JSON序列化,改为专用的能识别成员的二进制序列化;二是远程模式抛弃可靠度较低的缓存模式,客户端在通讯层实现异步数据集中处理机制,也就是自动合并异步请求批量处理应对高并发处理。
...全文

相关推荐

fastCSharp开源快速开发平台 代码生成 开源 强大 底层 稳定 最新 最全

fastCSharp是一个基于.NET元数据的代码生成的底层应用框架,目标是打造一个“开发+运行”效率双优的开源框架。 经过半年多的时间,除了与web开发直接相关的部分,都已经在fastCSharp part 1.5中完成了重写工作。 fastCSharp现在实现的代码生成实例主要有5个: 1、基于缓存查询模式的ORM代码生成实例(现在只支持MSSQL),自定义配置类是fastCSharp.setup.cSharp.sqlTable,同时支持反射模式fastCSharp.setup.cSharp.sqlTable.sqlTool。

张果

fastCSharp_part_1.6.rar_Bs Cs _C# BS_TCP服务器_彩色图片ASCii

fastCSharp开源框架开web,cs,bs结构的项目非常快。都是开源的哦,绝对保证。

御道御小黑

fastCSharp

在算法相同的情况下,运行效率最好的程序是怎么产生的?我知道那一定是硬编码的。但是硬编码开发时间最长,维护成本最高,最容易出错。所以没有多少人会一直坚守这个阵营。 我们需要降低开发成本,提高程序的可维护性。所以编程语言一直在朝着开发效率方面不断的进化,抽象能力越来越强。一般来说,编程语言的抽象能力越强,意味着代码量越少,程序的可维护性越高。与此同时,程序的运行效率也是越来越低。 到底是选择运行效率,还是选择开发效率?对很多人来说,这是个纠结的问题。人们的选择总是多样化的,有的人抛弃了运行效率,有的人抛弃了开发效率,有的人选择多种语言相互调和。 当然我也要做出自己的选择,那么它就是C#,因为不论是运行效率还是开发效率,它都能做到很不错。 我采取的方案是自动化+硬编码,自动化的实现方式是静态代码生成,硬编码主要针对于静态代码生成的模板程序。 我创建这个项目,目的是为了集思广益,更好的使用C#,打造一个“开发+运行”效率双优的开源框架,所以项目命名为fastCSharp。 由于我个人基本上只有web开发经验,所以我贡献的代码部分包括web开发部分,没有桌面应用部分,其它的就靠大家贡献了。 代码贡献者请注意:为了解决部分桌面应用平台升级问题,这个项目决定兼容.net framework2.0。 我个人贡献的内容主要包括五个方面: 1、数据集合操作支持.net2.0的链式编程体验(此部分现已迁移完毕)。 * 链式编程的核心思想是想到什么就点什么,程序书写思路更流畅。但要注意的是不要把程序写成一行,对于带参数的函数调用,最好是一行一个点,否则异常了都不知道哪里出的问题,比如: return diantou.dataProxy.questionTopic.getLinkIds(id) .getArray(value => diantou.dataProxy.question.get(value)) .getHash(value => value.bestAnswerId) .getArray(value => diantou.dataProxy.answer.get(value)) .getFind(value => value != null) .group(value => value.userId) .getArray(value => new KeyValuePair<diantou.dataProxy.user, int>(diantou.dataProxy.user.get(value.Key), value.Value.Count)) .group(value => value.Key.grade0) .getArray(value => new userStat { grade0 = value.Key, count = value.Value.Count, path = topic.path.bestAnswer, users = value.Value.rangeSort((left, right) => right.Value - left.Value, 0, 6) .getArray(user => diantou.dataProxy.user.get(user.Key, userId)) }); 2、基于.net元数据的静态代码生成器(下面会有相关介绍)。 3、我常用的几种C#程序模板,包括快速序列化、TCP网络通讯、SQL操作实体类、Web视图、单元测试等。 * 数据序列化一般用于网络通讯,非文本数据对象的序列化效率是.net的50倍以上。 * TCP网络通讯调用和调用本地函数一样简单。比如我配置好网络服务参数: public enum enumType { [showjim.config.tcpCall.server(Register = showjim.config.setup.register.DataProxy, IsRegisterOnly = true, VerifyFileName = showjim.config.setup.pub.VerifyFileName, ClientCount = 500, IsAsynchronous = false, IsCompress = false)] DataProxy, } 然后定义了一个网络函数: [showjim.setup.attribute.tcpCall(server = showjim.config.tcpCall.server.enumType.DataProxy)] public partial class favorite : diantou.dataModel.favorite.showjimCode.proxy<favorite>, showjim.sys.setup.Copy<favorite> { [showjim.setup.attribute.tcpCall] private static favorite[] GetUser(int id, int pageSize, int currentPage, int userId, out int count) { favorite[] values = GetUsers(id, userId); array.page page = new array.page(count = values.length(), pageSize, currentPage); return values.sub(page.SkipCount, page.CurrentPageSize).toArray() .getArray(value => value.setUser(userId)); } } 网络调用就像下面这么简单(多一个.client): protected diantou.dataProxy.favorite[] MyFavorite { get { return diantou.dataProxy.favorite.tcpCall.client.GetUser(CurrentUser.id, PageSize, query.page, CurrentUserId, out ItemCount); } } * SQL实体类只提供单表操作,但是提供细节操作,比如只更新某一字段。多表操作建议使用缓存模式(毕竟内存比人工优化便宜),采用链式编程处理。不过缓存模式不适应于数据量比较大的单机应用,我想单机应用一般也不会有多大数据量吧。 * Web视图数据实现按需取值(html模板用到什么取什么),紧凑拼接,无带宽浪费,不使用反射。比如我现在访问的http://www.51nod.com/today.html#!type=all,未压缩的页面数据只有1.55K,普通的ajax数据格式就算压缩了也比这个大。 * 另外还有URL查询字符串的自动解析功能,不用自己去转换查询参数Fomr["XXX"],参数或者字段定义什么类型就会自己接受什么类型。 4、与Web视图配套的js类库,包括数据驱动界面的实现、ajax功能、html编辑器、简单的筛选器、以及一些常用功能。 * 数据驱动界面,这个需要体验一下,比如在未登录的状态下访问http://www.51nod.com/today.html#!type=all,在浏览器地址栏输入 [removed]alert&#40;Showjim.PageView.SkinValue.header.Set({focus:{count:1,isCurrent:1}}&#41;); 或者在调试器里执行 Showjim.PageView.SkinValue.header.Set({focus:{count:1,isCurrent:1}}); 可以看到界面的变化。 5、一个简易的web服务器,实现部分了http1.1。 * www.51nod.com就是用这个做的web服务器,功能还有待完善。 前3个可应用于桌面,后两个应用于web,其实web服务器有时候也能应用于桌面或某些代理应用。 这里介绍一下代码生成器。 很多人认为代码生成==ORM。这里必须要纠正一下这个观念,ORM只是代码生成的一种应用场景。代码生成是一种自动化的实现,同时也是一种抽象方式,就好像面向对象也是一种抽象方式。 静态代码生成的实现方式也是多样的,最简单的模板是写程序直接拼接字符串,还有用VS自带的T4模板,一般来说都是面向文本文件的生成。 我使用的代码生成器有三个特点: 1、它的C#程序模板也是可编译的C#程序,不是文本文件。所以编写模板的时候,确定性的程序可以得到IDE的支持,包括错误提示、重构等。 2、它的模板与数据是分离的,它的输入参数主要是.net元数据和自定义属性组成视图,类似于网站概念里面的界面与程序分离。 3、它可以在编译事件中执行,无需界面操作。 在我的项目里,代码生成可以说是无处不在,有的时候是为了取代反射改善运行效率,有的时候是为了更方便的编写程序,有的时候是为了自动单元测试...那你将是为了什么呢? 我贡献的内容属于基础框架,不关联业务逻辑,所以没有几分钟开发一个XXX系统的能力。那个属于业务建模的范围,但是我希望这个框架能够助你快速实现模型。 使用这个框架搭建一般的网站,主要的工作量在于编写业务逻辑和提供数据视图。

bgaidu

无代码开发平台是什么,与传统开发方式有什么不同.pdf

为了使业务流程更加顺畅,世界各地的公司都在不断寻找新的应⽤系统开发⽅法,希望能对新的市场机会变化做出快速反应。但是传统的编程⽅法价格昂贵且耗时⻓,在系统 开发时,IT团队与业务团队是隔离开来的,那么如何改善这一现状?

wenjiandashi

插件化开源开发平台JXADF

NULL 博文链接:https://tom-x.iteye.com/blog/2238572

weixin_38669628
评论 16
收藏 已收藏
分享
返回顶部
showjim
非技术区 7,776 成员 63,111 内容