Delphi语言最好的JSON代码库 mORMot学习笔记1

mORMot没有控件安装,直接添加到lib路径,
工程中直接添加syncommons,syndb等到uses里

---------------------------------------------------------

在进行网络编程中需要JSON对象的构建与解析,
这个Delphi XE+自带:
{$IF CompilerVersion>22}, System.JSon{$ELSE}, DBXJSON{$IFEND}
不过,不好用,大家更喜欢SuperObject。我本人以前一直用JsonDataObjects。
今天要给大家介绍的这套JSON代码库算是“世外高人”,身怀绝世武功,而默默无闻,这就是 mORMot 系列开发框架。这是一个功能超级强大,学习曲线壁陡的开源框架。

http://synopse.info/

Project Name:  Synopse mORMot Framework
Document Name:  Software Architecture Design
Document Revision:  1.18
Date:  May 27, 2016
Project Manager:  Arnaud Bouchez

这是PDF文档下载地址:
http://synopse.info/files/pdf/Synopse%20mORMot%20Framework%20SAD%201.18.pdf
信息量达到惊人的2127页。大部分人被这份文档吓到,以至于错过了修炼这套“绝世武功”的机会。
今天咱们从中把JSON编程单拣出来,看看mORMot有什么神奇的地方。
使用mORMot没有想象的那样难,使用JSon只需要引用一个文件synCommons。下面我们来看代码,将SuperObject与mORMot做一个对比:

const cstMaxTest = 100000;

procedure TForm1.TestSO;
var jo: ISuperObject; i: Int64; sw: TStopWatch;
begin
  sw := TStopWatch.Create;
  jo := SO();
  i := 0;
  while i < cstMaxTest do begin
    jo.S['Name'] := 'This is a Str' + IntToStr(i);
    jo.I['Age'] := i;
    jo.O['List'] := SO('[1,"Hello",5,{"name":"c5soft","age":50}]');
    if i = 100 then
      Log('SO:' + jo.AsJSon());
    inc(i);
  end;
  Log('SuperObject: ' + sw.Stop());
  sw.free;
end;

procedure TForm1.TestMJ;
var jo: Variant; i: Int64; sw: TStopWatch;
begin
  TDocVariant.New(jo); ;
  sw := TStopWatch.Create;
  i := 0;
  while i < cstMaxTest do begin
    jo.Name := 'This is a Str' + IntToStr(i);
    jo.Age := i;
    jo.List:=_JSon('[1,"Hello",5,{"name":"c5soft","age":50}]');
    if i = 100 then
      Log('MJ:' + VariantSaveJSON(jo));
    inc(i);
  end;
  Log('mORMot JS: ' + sw.Stop());
  sw.free;
end;

做一个10万次的测试,这是输出结果:
SO:{"Age":100,"Name":"This is a Str100","List":[1,"Hello",5,{"age":50,"name":"c5soft"}]}
SuperObject: 00:01.561
MJ:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
mORMot JS: 00:00.326

发现了吧,mORMot比SuperObject快太多,干同样的活,SuperObject用的时间是mORMot的5倍。
使用mORMot还用另外两个好处:
其一、用jo.Name代替jo.S['Name']更直观
其二、在调试阶段设置断点,观察jo的值,delphi告诉你:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}
而你去跟踪SuperObject的jo,Delphi只能告诉你那是一个对象,具体值是多少,她说“太复杂,一言能尽”,结果什么也看不到。

下期预告:windows下构建http服务,放弃indy(intraweb),改用iocp(diocp)吗?错了!用http.sys才是王道,这一切mORMot已经悄悄地为我们准备好了。

http://bbs.2ccc.com/topic.asp?topicid=511839

---------------------------------------------------------

我测试了,我一个表内一次提取12万多条数据,服务器端生成json串时间不到3秒,程序和数据库都在我机器上,不知道测试的准确不

---------------------------------------------------------

mORMot内部集成的数据库是SQLite,mORMot可以连接任何当前流行的数据库,mORMot还可以不连接任何数据库,用内存表来工作。

说到SQLite,这也是很牛X的,很独特的。这是一种动态数据类型的数据库,create table时可以不指定字段类型,指定了数据类型比如整数型,也可以保存字符串类型的数据。这是目前开源、跨平台、代码量最小的数据库。如果数据量不大,希望集成在可执行文件中 (embbed),sqlite是一个很好的选择。

如果要输出很大的数据到终端界面,一定要使用分页。即使Delphi生成json数据
不慢,网络传送速度快不了,前端(比如浏览器)装配数据快不了。SQLite的select 支持分页:
  SELECT ... FROM ... WHERE ... ORDER BY .. LIMIT... OFFSET...

没有mORMot,可以用DISQLite,仅能做单机版的软件,有了mORMot,使用SQLite数据库可以做C/S架构的软件,而且很方便的就有了3Tier, 4Tier。

转载于:https://www.cnblogs.com/h2zZhou/p/7364947.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3GP文件格式分析

1. 概述现在很多智能手机都支持多媒体功能&#xff0c;特别是音频和视频播放功能&#xff0c;而3GP文件格式是手机端普遍支持的视频文件格式。目前很多手机都支持h263视频编码格式的视频文件播放&#xff0c;还有些手机支持h264。音频文件格式普遍支持amr&#xff0c;有些手…

mysql group concat_MySQL 的 GROUP_CONCAT 函数详解

GROUP_CONCAT(expr) 函数会从 expr 中连接所有非 NULL 的字符串。如果没有非 NULL 的字符串&#xff0c;那么它就会返回 NULL。语法如下&#xff1a;GROUP_CONCAT 语法规则它在递归查询中用的比较多&#xff0c;但要使用好它并不容易。所以让我们一起来看看吧&#xff1a;假设有…

ORACLE数据库 常用命令和Sql常用语句

ORACLE 账号相关 如何获取表及权限 1.COPY表空间backup scottexp登录管理员账号system2.创建用户 create user han identified(认证) by mima default tablespace users&#xff08;默认的表空间&#xff09; quota&#xff08;配额&#xff09;10M on users;创建账号分配权限g…

光荣之路测试开发面试linux考题之四:性能命令

Hi,大家好我是tom,I am back.今天要给大家讲讲linux系统一些性能相关命令。 1.fdisk 磁盘管理 是一个强大的危险命令&#xff0c;所有涉及磁盘的操作都由该命令完成&#xff0c;包括&#xff1a;新增磁盘、增删改磁盘分区等。 1.fdisk -l 查看磁盘分区情况 Disk /dev/sda: 27.8…

一起学并发编程 - 优雅关闭

Java中原来在Thread中提供了stop()方法来终止线程&#xff0c;但这个方法是不安全的&#xff0c;所以一般不建议使用。文本将介绍两种可以优雅的终止线程的方式...<!-- more --> 第一种 在JAVA《Java多线程模式》中有一种叫Two-Phase Termination&#xff08;两步终止&am…

mac安装完mysql后关机特别慢_mysql-Mac终端下遇到的问题总结

为了方便启动mysql服务&#xff0c;修改/etc/.bash_profile文件&#xff0c;如下alias mysql"/usr/local/mysql/bin/mysql"alias mysqladmin"/usr/local/mysql/bin/mysqladmin"或者alias mysqlstart"sudo /usr/local/mysql/support-files/mysql.serve…

sending data mysql slow Mysql查询非常慢的可能原因

1.用explain看看mysql的执行情况,可以得知,task_id扫描了近20万条数据,而且这个task_id不是索引 2.为这个task_id所在的表,将此字段添加索引后,查询就变得很快了 转载于:https://www.cnblogs.com/Skrillex/p/7365590.html

mybatis 添加语句返回对象_mybatis的insert语句插入数据时的返回值的实现

mybatis的insert语句插入数据时的返回值的实现,语句,返回值,那条,都是,站长站mybatis的insert语句插入数据时的返回值的实现易采站长站&#xff0c;站长之家为您整理了mybatis的insert语句插入数据时的返回值的实现的相关内容。mybatis的sql语句一般是配置在配置文件中&#xf…

打包上架

昨天写的打包上架&#xff0c;分组到了文章&#xff0c;发现不便查看贴链接到这里&#xff1a; http://www.cnblogs.com/ITCoderW/articles/7597969.html 最近一个版本的审核的过程 当我们上传到APP Store一个新的版本后 登录ITunes Connect就可以看到相应的版本的审核的状态 粗…

inet_pton函数和inet_ntop函数的用法及简单实现

http://blog.csdn.net/eagle51/article/details/53157643?utm_sourceitdadao&utm_mediumreferral 这两个函数是随IPv6出现的新函数&#xff0c;对于IPv4地址和IPv6地址都适用。函数名中的p和n非别代表表达&#xff08;presentation&#xff09;和数值&#xff08;numeric&…

mysql 5.7 延迟同步_MySQL5.6升级5.7时出现主从延迟问题排查过程

最近在做zabbix的数据库MySQL5.6升级5.7时&#xff0c;出现主从延迟问题&#xff0c;这个问题困扰了很久没有解决&#xff0c;昨天终于解决了&#xff0c;整理了一下整个排查过程&#xff0c;分享给大家。环境说明&#xff1a;mysql主库为5.6的版本&#xff0c;有四个从库&…

架构设计--仅是软件开发之第二大影响力?!

SDWest2006&#xff08;译注1&#xff09;对我来说是个有趣的大会。我除了星期三之外&#xff08;当时我正飞往费城参加一个客户会议 因此错过了Jolt颁奖部分&#xff09;每天都在演讲。我也参加了一些谈话和会议&#xff1b;其中最引人关注的是Mike Cohn的计划与估算的谈话。…

WiFi密码分享有妙招 不必口头相传

移动互联网的迅速崛起&#xff0c;使得我们可以方便的使用手持移动设备进行上网。尤其是在家庭中&#xff0c;使用智能手机、平板电脑、笔记本电脑等移动设备进行上网和娱乐已经成为主流&#xff0c;台式机上网正日渐式微。在家中时&#xff0c;我们通过无线路由器提供的WiFi网…

javaweb(二十一)——JavaWeb的两种开发模式

一、JSPJavaBean开发模式 1.1、jspjavabean开发模式架构 jspjavabean开发模式的架构图如下图(图1-1)所示 图1-1 在jspjavabean架构中&#xff0c;JSP负责控制逻辑、表现逻辑、业务对象&#xff08;javabean&#xff09;的调用。 JSPJavaBean模式适合开发业务逻辑不太复杂的web应…

Redis基于客户端分片的集群案例(待实践)

说明&#xff1a; 下面的示例基本都是基于Linux去实现&#xff0c;目的是为了环境的统一&#xff0c;以便于把性能调整到最优。且基于Java。建议生产环境不要使用Windows/Mac OS这些。 在Java领域&#xff0c;基于客户端进行分片最常用的库应该是Jedis&#xff0c;下面基本是基…

mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大

同样的功能,不同的写法,时间和内存占用差了几千倍,不废话,直接上代码第一种写法:代码如下:$RsDB::get($_ENV[DB],3,"SELECT * FROM _xiazhu WHERE uid IN(SELECT id FROM _user WHERE id<5000)");var_dump($Rs);内存和时间:内存使用:96514.53Kb 运行时间:1272.73m…

高效程序员应该养成的七个习惯

对于软件工程师来说&#xff0c;工作也许意味着许多东西 -- 稳定的收入、做自己感兴趣的项目、找一份更好工作的跳板&#xff0c;或者你只是喜欢与其他程序员共事。但说到“效率”&#xff0c;强调的是在一定时间内按质完成项目的能力。Phil Chu根据自己的经验提出了高效程序员…

概率论与数理统计思维导图知识框架_考研概率论与数理统计 综合题型秘籍思维导图① 随机变量1~3章 [21考研上岸之旅]...

Hello World&#xff0c;我的朋友&#xff0c;这里是一颗小白蛋&#xff0c;大千世界&#xff0c;很高兴以这样的方式与你相遇前言在复习过程中发现概率论知识点很少且集中 所以没有分开章节去整理王安式概率论辅导讲义张宇概率论9讲方浩强化班1800题 综合题型秘籍在学习过程中…

关于软件的架构设计

好的开始相当于成功一半 开始之初的架构设计决定着软件产品的生死存亡。“好的开始相当于成功一半”。 开始的架构设计也是最难的&#xff0c;需要调研同类产品的情况以及技术特征&#xff0c;了解当前世界上对这种产品所能提供的理论支持和技术平台支持。再结合自己项目的特…

[Oracle]快速构造大量数据的方法

[Oracle]快速构造大量数据的方法&#xff1a;create table tab001(id integer primary key, val varchar2(100));insert into tab001 select ij,rpad(to_char(ij),100,A) from ( with DATA2(j) as ( select 0 j from DUAL …