DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tino0914
今日帖子: 30
在线用户: 14
导航: 论坛 -> 文档资料 斑竹:liumazi,ruralboy  
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 17:58:35
标题:
Delphi语言最好的JSON代码库 mORMot学习笔记1 浏览:32885
加入我的收藏
楼主: 在进行网络编程中需要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已经悄悄地为我们准备好了。
此帖子包含附件:
JPEG 图像
大小:24.8K
----------------------------------------------
-
作者:
男 brh616 (风风风) ★☆☆☆☆ -
盒子活跃会员
2016/6/7 18:29:43
1楼: To be continued按此在新窗口浏览图片
----------------------------------------------
风风风
作者:
男 ldmmig (ldm) ★☆☆☆☆ -
盒子活跃会员
2016/6/7 18:32:04
2楼: 我刚把服务换成http.sys
----------------------------------------------
-
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2016/6/7 19:16:58
3楼: 好的,是时候尝尝新东西了,期待楼主写续集,有对比才能更直观。
----------------------------------------------
-
作者:
男 mike1234567890 (Mike) ★☆☆☆☆ -
普通会员
2016/6/7 20:21:10
4楼: 好贴子,楼主多发些相关的内容吧
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 20:51:08
5楼: @ldmmig (ldm):
用的是什么框架?
----------------------------------------------
-
作者:
男 michaelacu (M哥) ▲▲▲▲▲ -
普通会员
2016/6/7 21:23:55
6楼:  专门登录收藏,楼主好样的
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 21:26:06
6楼: 随便做一下JsonDataObject的测试,因为JsonDataObject是基于UnicodeString的,改用Berlin编译,运行结果如下:
SO:{"Age":100,"Name":"This is a Str100","List":[1,"Hello",5,{"age":50,"name":"c5soft"}]}
SuperObject: 00:00.880
JD:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
JsonDataObject: 00:00.084
MJ:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
mORMot JS: 00:00.170
这回JsonObject胜出,比mORMot节省一半的时间。这个结果与前面的是同一台电脑上跑出来的结果,前面的是Delphi7编译的,可见berlin编译出来的代码运行速度比delphi7快了差不多1倍。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 21:26:59
7楼: JsonDataObject的代码这样写:
procedure TForm1.TestJD;
var jo: TJSonObject; i: Int64; sw: TStopWatch;
begin
  sw := TStopWatch.Create;
  jo := TJSonObject.Create;
  i := 0;
  while i < cstMaxTest do begin
    jo.S['Name'] := 'This is a Str' + IntToStr(i);
    jo.I['Age'] := i;
    jo.A['List'] :=TJSonArray(TJSonObject.Parse('[1,"Hello",5,{"name":"c5soft","age":50}]'));
    if i = 100 then
      Log('JD:' + jo.ToJSon());
    inc(i);
  end;
  Log('JsonDataObject: ' + sw.Stop());
  jo.Free;
  sw.free;
end;
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 21:33:23
8楼: 上面是32Bit的测试结果,再跑一个64bit的:
SO:{"Age":100,"Name":"This is a Str100","List":[1,"Hello",5,{"age":50,"name":"c5soft"}]}
SuperObject: 00:01.291
JD:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
JsonDataObject: 00:00.104
MJ:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
mORMot JS: 00:00.169

SO:{"Age":100,"Name":"This is a Str100","List":[1,"Hello",5,{"age":50,"name":"c5soft"}]}
SuperObject: 00:01.288
JD:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
JsonDataObject: 00:00.116
MJ:{"Name":"This is a Str100","Age":100,"List":[1,"Hello",5,{"name":"c5soft","age":50}]}
mORMot JS: 00:00.169



可见64位的系统不比32位快。SuperObject的64位版本慢了接近1倍。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 22:03:47
9楼: 刚才的测试结果有误,没有考虑调试状态,重新跑一遍:
Berlin Debug Mode
SuperObject: 00:01.150
mORMot JS: 00:00.627

Berlin Release Without Debug
SuperObject: 00:00.909
mORMot JS: 00:00.193


Delphi7 Debug Mode
SuperObject: 00:01.606
mORMot JS: 00:00.325

Delphi7 Release Without Debug
SuperObject: 00:01.141
mORMot JS: 00:00.189

正确结论是delphi7编译出来程序的速度实际更快一些。再看看exe大小,delphi7做出来的500K,Berlin做的2200K, 64位的就更夸张了,3600K。用delphi开发,仅在windows上跑,停留在delphi7/2007版应该是一个理性的选择。
这不得不说mORMot的好,mORMot让咱们仅用delphi7就完全支持unicode,为此从底层做起,整个框架完全采用UTF8编码,也可以在free pascal下编译,在linex下跑。这里批评一下RealThinClient,连ANSI编码都只做了单字节的,看来压根儿没打算离开欧美。

附测试代码:
此帖子包含附件:c5soft_201667224418.zip 大小:83.3K
----------------------------------------------
-
作者:
男 pwhll (渭水阳) ★☆☆☆☆ -
盒子活跃会员
2016/6/7 22:46:36
10楼: 楼主经测试发现synCommons.pas 只这一个文件还是不行,还需要Synopse.inc,SynopseCommit.inc,SynLZ.pas这三个文件,我是在Xe下测试的,更多的功能有待发现
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 23:14:34
11楼: 楼上补充得很好,我前文说的是"只需要引用一个文件synCommons",实际上synCommons还会拉进来几个文件,GExpert中有一个工具,叫“Project Dependencies"很好用:
此帖子包含附件:
JPEG 图像
大小:73.7K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/7 23:36:33
12楼: 啥叫“Cross-cutting" ?
mORMot的文档中多次出现Cross-cutting,这是那种非常简单,又非常难懂的英语词汇。Cross-cutting就是completely cutting, 比如用小刀切西瓜,是完全切开,不是切下一点点,或者切一半。引申为“贯彻始终”的意思。Cross-cutting的东西就是mORMot各个模块都要用到的东西,函数、结构、对象等等,是基础性的东西。比如SynCommons.pas、SynLog.pas、SynTests.pas就属于Cross-cutting性质的单元,而rawUTF8属于Cross-cutting性质的数据类型。用Cross-cutting来说切西瓜,指的不是那瓜,而是那刀;也不是那刀,而是那刀的动作;也不是那动作,而是那动作的气势。
----------------------------------------------
-
作者:
男 vga (vga) ★☆☆☆☆ -
盒子活跃会员
2016/6/8 6:34:09
13楼: “Cross-cutting" 劈开 怎样?
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/8 7:05:54
14楼: 劈开应该是crossing cutted
----------------------------------------------
-
作者:
男 ldmmig (ldm) ★☆☆☆☆ -
盒子活跃会员
2016/6/8 7:26:21
15楼: @c5soft
就是mORMot
----------------------------------------------
-
作者:
男 ldmmig (ldm) ★☆☆☆☆ -
盒子活跃会员
2016/6/8 8:36:16
16楼:
用ab测试例子synopse mORMot\trunk\SQLite3\Samples\09 - HttpApi web server

,超过1000并发,必挂。
----------------------------------------------
-
作者:
男 lzd123 (昨夜清风) ★☆☆☆☆ -
盒子活跃会员
2016/6/8 9:05:06
17楼: 支持,等待http.sys的精彩出场!!!
----------------------------------------------
向你学习
作者:
男 newsxy (呼呼) ★☆☆☆☆ -
盒子活跃会员
2016/6/8 9:24:30
18楼: 记号关注
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/8 11:35:14
19楼: D:\Dev\Lib\SQLite3\Samples\09 - HttpApi web server>ab -n50000 -c10000 http://localhost/hello
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:        Synopse
Server Hostname:        localhost
Server Port:          80

Document Path:          /hello
Document Length:        38 bytes

Concurrency Level:      10000
Time taken for tests:   21.768 seconds
Complete requests:      50000
Failed requests:        0
Write errors:          0
Total transferred:      15750000 bytes
HTML transferred:       1900000 bytes
Requests per second:    2297.00 [#/sec] (mean)
Time per request:       4353.503 [ms] (mean)
Time per request:       0.435 [ms] (mean, across all concurrent requests)
Transfer rate:          706.60 [Kbytes/sec] received

Connection Times (ms)
          min  mean[+/-sd] median   max
Connect:        0    0   0.3      0      15
Processing:  1569 4086 751.4   4496    4627
Waiting:      404 2131 1067.8   2018    4205
Total:       1569 4086 751.4   4496    4627

Percentage of the requests served within a certain time (ms)
  50%   4496
  66%   4582
  75%   4594
  80%   4596
  90%   4606
  95%   4615
  98%   4621
  99%   4623
 100%   4627 (longest request)

D:\Dev\Lib\SQLite3\Samples\09 - HttpApi web server>pause
请按任意键继续. . .

这是:ab -n50000 -c10000 http://localhost/hello ;输出结果
并发数设置为1万,我还想做一个2万并发,ab先崩溃,干不了。我笔记本风扇转得飞快。先前做diocp还有不少fail, http.sys一个错误也没有,微软的东西是靠得住的。
----------------------------------------------
-
作者:
男 ldmmig (ldm) ★☆☆☆☆ -
盒子活跃会员
2016/6/8 11:35:16
19楼: 去掉任何处理代码,只返回一个字符串的测试结果,自己看附件。
此帖子包含附件:
PNG 图像
大小:13.9K
----------------------------------------------
-
作者:
男 zoujun3281 (无奈) ▲▲▲▲▲ -
普通会员
2016/6/8 22:59:37
20楼: 收藏
----------------------------------------------
delphi你妹
作者:
男 mickeylan (牧龙鼠) ★☆☆☆☆ -
普通会员
2016/6/9 11:20:33
21楼: 神器呀,楼主辛苦了!
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/9 14:41:43
22楼: 上面19楼,仅让服务器返回<html><body>Hello World!</body></html>这样简单的页面。这回让服务器返回一个真实的页面,页面接近14K,内含有多个css、js、jpg连接,下面是测试结果:

ab -n100000 -c10000 http://localhost/index.html

Document Path(文档路径):          /index.html
Document Length(请求文档大小):        13812 bytes 

Concurrency Level(并发数):      10000
Time taken for tests(测试耗费时间):   51.937 seconds
Complete requests(总的请求数):      100000
Failed requests(失败请求数):        0
Write errors:          0
Total transferred:      1405200000 bytes
HTML transferred:       1381200000 bytes
Requests per second(每秒请求数(平均)):    1925.42 [#/sec] (mean)
Time per request(每次并发请求时间(所有并发)):       5193.685 [ms] (mean)
Time per request(每一请求时间(单个并发)):       0.519 [ms] (mean, across all concurrent requests)
Transfer rate(传输速率):          26421.81 [Kbytes/sec] received

Connection Times (ms)
          min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       8
Processing:  1648 5032 709.1   5241    5889
Waiting:      944 2487 536.5   2439    3985
Total:       1648 5032 709.1   5241    5889

Percentage of the requests served within a certain time (ms)
  50%   5241
  66%   5279
  75%   5298
  80%   5317
  90%   5420
  95%   5675
  98%   5798
  99%   5830
 100%   5889 (longest request)
----------------------------------------------
-
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2016/6/9 15:43:18
23楼: mORMot,从提供的例子开始学习,其实很简单。
关于文档,是很丰富,但是作者是法国人,英语书写流畅程度一般般,读起来不舒服,但是能懂。

mORMot,通过FreePascal/Lazarus,Linux的支持已经很全面,包括Intel 32bit/64bit,和ARM CPU的 32/64位。详见:http://blog.synopse.info/post/soaarmfpc
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/9 16:08:04
23楼: 构建与IIS相同处理能力的http服务器 mORMot学习笔记2
上面的测试大家已经看到了,用delphi写的http服务器,能够承受10000个并发连接。这是一台i7-2640 双核四线程 主频2.8G,16G内存,配SSD硬盘,Win10 64位的笔记本电脑上的测试结果。

如此强悍、如此稳定,应该不会输给Apache(httpd),甚至可以与Nginx一决高下。 这就是mORMot为咱们搞delphi开发带来的福音。
mORMot中的http服务模块有两个选择,对于windows(xp sp2以上版本),调用iis相同的http.sys内核,当http.sys服务不存在(老win系统或者linux)采用与iocp相同模式,完全用delphi语言写的一个http服务。

这是百度百科对http.sys的介绍
http://baike.baidu.com/link?url=OB-SOKR-NLmxq4nyaSJAmpKdJYCV0u3a3X2JNuSLdz5OfhjbWAzduK43a-P7BZ7LSRcYsy7p0tq3cPUg1CrONK

一句号,调用http.sys,你的程序就具备了提供与iis相同能力的http服务,健壮、稳定、支持高并发。而你不需要安装并启动iis服务器。站在巨人的肩膀上,你就具备了巨人的能力。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/9 16:26:37
24楼: mORMot的作者是一位软件工程领域的大师,但不是一个会讲故事故事的人,也就不是一个好老师。这么好的产品,这么厚重的文档,却没有让自己的产品“火”起来。

微软http api说明书地址:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364622(v=vs.85).aspx
----------------------------------------------
-
作者:
男 744840146 (744840146) ▲▲▲▲▲ -
普通会员
2016/6/9 17:01:55
25楼: 玩mORMot有一段时间了,我觉得最好用的有以下几点:

1 SYNDB中的TSQLDBConnectionProperties,指定参数后自动建立带池的数据连接服务,支持sqlite,oracle,odbc,jet,另外提供uni,zeos,firedac,bde,nexus连接进行转化。

2 TSQLDBConnectionProperties+SynDBRemote中的TSQLDBServerHttpApi或者TSQLDBServerSockets,直接把数据转化成http访问,客户端TSQLDBSocketConnectionProperties进行连接后,使用SynDBMidasVCL中的TSynDBDataSet就可以直接完成http的三层系统。TSynDBDataSet就是继承的tclientdataset,ClientDataset使用的方便,强大,不用质疑。例子21,例子中没有使用TSynDBDataSet,如下图所示。


3 SynCrossPlatformJSON中的TJSONVariantData提供跨平台的JSON支持,速度比SuperObject,XSuperObject,QJson都快,例子25,要安装其它几个库并打开编译开关。例子25。

4 websocket通讯,例子31。

最后一点,要看mORMot的强大,最好是编译例子15,打开编译开关,看看真正的实力。
此帖子包含附件:
PNG 图像
大小:54.8K
----------------------------------------------
-
作者:
男 744840146 (744840146) ▲▲▲▲▲ -
普通会员
2016/6/9 17:11:27
26楼: 有一个最大不是幸是 跨平台支持的是FPC,而不是支持FMX的android,IOS
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2016/6/9 17:39:14
27楼: SuperObject用了接口,生存期不需要关心.就这一点我就舍不得它啊
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/9 18:02:36
28楼: mORMot 中JSON使用的是Variant,生存期由编译器自动管理,也不需要手动free。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/9 20:30:38
29楼: Configure the HTTP traffic on your local machine. A nice alternative for netsh http.

http://www.codeproject.com/Articles/437733/Demystify-http-sys-with-HttpSysManager
----------------------------------------------
-
作者:
男 yxsoft (yxsoft) ★☆☆☆☆ -
盒子活跃会员
2016/6/9 21:00:18
30楼: 先收藏吧,感觉很牛的样子
----------------------------------------------
Great!
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/9 23:54:12
31楼: LVCL Light VCL(for Delphi 6-7 only) mORMot学习笔记3

LVCL是对VCL的精简,是mORMot带给Delphi6/7使用者的又一个小小的惊喜,如果仅用简单的用户界面,编译后的非压缩的exe文件大小只有几十KB,与KOL有一拼,而易用性却比KOL强得多。demo编译后的大小是58K,用aspack压缩后是33K。看看LVCL支持哪些控件:
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Edit1: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    Memo1: TMemo;
    CheckBox1: TCheckBox;
    GroupBox1: TGroupBox;
    RadioButton2: TRadioButton;
...
要是作为后台服务的控制台,够用了吧。
----------------------------------------------
-
作者:
男 qdamao (qdamao) ★☆☆☆☆ -
普通会员
2016/6/10 1:15:38
32楼: mORMot的作者挺NB的,第一次知道是因为他优化并改进了Delphi运行库的bug,然后borland好像以版权为由不允许他发布源码,从此对borland的作死性有了更深的认识。
----------------------------------------------
-
作者:
男 mochizuki (mochizuki) ★☆☆☆☆ -
普通会员
2016/6/10 7:53:14
33楼: 嗯,又是一个好东西,感谢楼主
----------------------------------------------
-
作者:
男 go_on (go_on) ★☆☆☆☆ -
盒子活跃会员
2016/6/10 9:14:29
34楼: 第一次知道这个东西,去了解一下,谢谢
----------------------------------------------
-
作者:
男 FengLinYuShu (FengLinYuShu) ★☆☆☆☆ -
盒子活跃会员
2016/6/10 13:19:57
35楼: 学习!好像很NB的样子, MARK一下
----------------------------------------------
-delphi大富翁论坛http://www.delphibbs.com
作者:
男 chonghai (DBlue) ★☆☆☆☆ -
盒子活跃会员
2016/6/10 17:15:51
36楼: 喜欢并欢迎这样的分享。
Delphi虽然小众,但一样可以很精彩。
----------------------------------------------
喜欢Delphi,关注Delphi,愿和广大爱好者交朋友。
作者:
男 err0rc0de (code) ▲▲▲▲△ -
普通会员
2016/6/10 18:16:34
37楼: 它不是自带有个json performance比较吗?

mORMot\SQLite3\Samples\25 - JSON performance

看了楼主的测试用例,瞬间感觉你写的示例弱爆了,haha
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/11 22:05:57
38楼: 按此在新窗口浏览图片 弱爆了就对了,谁都看得懂。
哥们,咱不是想做一个全能的测试程序,只想写一段会superobject就能看得懂的mORMot的代码片段,顺便测试一下速度。mORMot的作者已对现有的多种JSON实现做了全面测试,包括QJSon。

http://blog.synopse.info/?q=Benchmarking+json

继续研究http.sys,将微软的httpapi的C语言实例从https://msdn.microsoft.com/en-us/library/windows/desktop/aa364640(v=vs.85).aspx复制粘贴出来,编译通过,在Win10上跑了一下。这段代码是httpapi 1.0的Sample Application,对于如何写http.sys调用程序小有帮助。哪位老兄有httpapi 2.0的用例,愿意请教。
此帖子包含附件:c5soft_201661122557.rar 大小:60.7K
----------------------------------------------
-
作者:
男 zhyhui2008 (huizi) ★☆☆☆☆ -
普通会员
2016/6/12 8:50:39
39楼: 群主,抓紧时间组建个mORMot交流群,这么好的东西,还开源,让大家都用起来,感觉资料不少,都是英文的,挡住了不少人
----------------------------------------------
-
作者:
男 fangl2010 (fangl) ★☆☆☆☆ -
普通会员
2016/6/12 14:13:26
40楼: 支持https方便吗
----------------------------------------------
-
作者:
男 pherody (pherody) ★☆☆☆☆ -
普通会员
2016/6/12 16:17:35
41楼: 31 - WebSockets里面的Project31SimpleEchoServer.exe,在浏览器里输入什么地址测试这个是否正常运行?
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/12 19:46:22
42楼: 输入http://localhost:8888/root/TimeStamp
----------------------------------------------
-
作者:
男 744840146 (744840146) ▲▲▲▲▲ -
普通会员
2016/6/13 8:53:16
43楼: 直接从资源管理器里打开就可以,这个例子没有添加文件http访问功能,所以只能直接打开Project31SimpleEchoServer.html

支持websocket的浏览器,Chrome,firefox,IE必须是9以上
----------------------------------------------
-
作者:
男 yq97001 (yq97001) ★☆☆☆☆ -
普通会员
2016/6/13 9:36:32
44楼: mORMot 在delphi10.1 berlin里怎么样安装编译?
----------------------------------------------
-
作者:
男 744840146 (744840146) ▲▲▲▲▲ -
普通会员
2016/6/13 17:25:31
45楼: mORMot没有控件安装,直接添加到lib路径,

工程中直接添加syncommons,syndb等到uses里
----------------------------------------------
-
作者:
男 coolslob (coolslob) ★☆☆☆☆ -
盒子活跃会员
2016/6/13 18:55:57
46楼: 楼主V5


很久没见这样的贴了。
----------------------------------------------
-
作者:
男 coolslob (coolslob) ★☆☆☆☆ -
盒子活跃会员
2016/6/13 18:59:02
47楼: LZ, 这么好的帖子,可传世。

建议发到某个blog吧,  盒子这帖子里,真不好阅读。
----------------------------------------------
-
作者:
男 kylix2008 (kylix2008) ★☆☆☆☆ -
普通会员
2016/6/13 21:59:14
48楼: 两三年前了解SQLite3(发布时不带dll)时偶然看到mORMot,感觉好像很牛,一直没时间学。
顶。
----------------------------------------------
-
作者:
男 fangl2010 (fangl) ★☆☆☆☆ -
普通会员
2016/6/13 22:25:51
49楼: 例子09 D7下编译不了 TSockData是哪个单元的
----------------------------------------------
-
作者:
男 xinlnix (xinlnix) ★☆☆☆☆ -
普通会员
2016/6/14 12:45:22
50楼: 官方文档 8.3.7 
By default, all ORM read operations will be run in concurrent mode, and all ORM write operations will 
be executed in blocking mode. This is expected to be both safe and fast, with our internal  SQLite3 
engine, or most of the external databases. 

但是我不认为对 SQL 数据库,写入阻塞模式,又快又安全。写入存在瓶颈。
----------------------------------------------
-
作者:
男 xinlnix (xinlnix) ★☆☆☆☆ -
普通会员
2016/6/14 12:54:56
51楼: 文档提到 per-thread connection pool,既然每线程一个连接,那么每线程一个事务不行吗?难道非要跨线程提交事务,MSSQL 当然不允许跨线程事务了。若每线程事务,就允许并发写入。这个文档实在搞不懂,但字里行间,感觉作者就是要推荐使用一个背景线程执行所有写入,肯定会存在瓶颈。

我这样理解是否正确,高手指正。
----------------------------------------------
-
作者:
男 yangtze (mcjmcj) ★☆☆☆☆ -
普通会员
2016/6/14 22:56:02
52楼: 学习,mark先
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/14 23:53:20
53楼: 终于找到一个c++写的http.sys 2.0 api调用的例子,放到这里备查:
此帖子包含附件:c5soft_201661423535.zip 大小:1.13M
----------------------------------------------
-
作者:
男 brh616 (风风风) ★☆☆☆☆ -
盒子活跃会员
2016/6/15 7:55:58
54楼: mORMot/CrossPlatform/SynCrossPlatformJSON.pas

uses
  SysUtils,
  Classes,
{$ifdef NEXTGEN}
  System.Generics.Collections,
{$else}
  Contnrs,
{$endif}
  Variants,
TypInfo;

好像这个是独立的单元。
----------------------------------------------
风风风
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/6/15 11:10:08
55楼: 我个人的观点:
mORMot的Json从一开始就只是为了ORM服务的,它不适合于对未知Json字符串解析的。
JsonDataObjects的作者是Andy,就是出了IDEFix的那个牛人,它可以适合对未知Json字符串解析,从速度上来说是很快的。
但是如果从解析的操作性的丰富度上来的,还是比不过QJson,SuperObject,但是SuperObject的速度这些中相对最慢的。
综合来说,QJson和速度和操作性上有一个很好的平衡,不过相对的,内存消耗相对比较大。
----------------------------------------------
-
作者:
男 zhyhui2008 (huizi) ★☆☆☆☆ -
普通会员
2016/6/15 14:12:38
56楼: 现在电脑性能都这么好了,就那一点速度差别可以忽略不计,用户根据就感觉不出来
----------------------------------------------
-
作者:
男 zhyhui2008 (huizi) ★☆☆☆☆ -
普通会员
2016/6/15 14:13:31
57楼: 不用计较太多
----------------------------------------------
-
作者:
男 zhyhui2008 (huizi) ★☆☆☆☆ -
普通会员
2016/6/15 14:14:44
58楼: mORMot 跟人这几天根据demo做了一下测试,确实不错,下一步偶的分布式软件可以采用这个框架试试
----------------------------------------------
-
作者:
男 robinson2006 (Leo) ★☆☆☆☆ -
普通会员
2016/6/15 14:43:55
59楼: mORMot好久之前就关注了.前段时间刚好用上.看了楼主帖子的得到不少启发.非常感谢
THttpApiServer 确实好用.简单速度快.日常使用完全够用了.
如果要超大并发.可以用Erlang. 有一个cowboy开源项目.据说100万并发都撑的住.
----------------------------------------------
-
作者:
男 sczhyq (旺财) ★☆☆☆☆ -
普通会员
2016/6/15 15:20:22
60楼: 为什么不用 System.JSON.pas 

我就用他的, 因为是原生的,包含在RTL内的,效率高不高没考究
----------------------------------------------
我84砖家
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/15 17:38:34
61楼: System.JSON.pas bug很多,速度很慢,delphi低版本不能用,不用mORMot,JsonDataObjects是最好的选择,已经过项目的考验,很可靠。
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2016/6/15 19:27:40
62楼: to c5soft (走遍天下) 请教一下:
1、 mORMot对于数据库的各种数据类型都支持吧,比如二进制类型。 
2、如果数据集有2万条近20M的数据,这么大的数据量转成JSON再传输会不会很慢。
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 zhyhui2008 (huizi) ★☆☆☆☆ -
普通会员
2016/6/15 20:25:13
63楼: 我测试了,我一个表内一次提取12万多条数据,服务器端生成json串时间不到3秒,程序和数据库都在我机器上,不知道测试的准确不
----------------------------------------------
-
作者:
男 kylix2008 (kylix2008) ★☆☆☆☆ -
普通会员
2016/6/15 20:45:57
62楼: mORMot框架有多牛?
http://www.cnblogs.com/findumars/p/5568154.html  应该是楼主据本文开的博吧。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/15 21:31:20
64楼: @doorkey (DoorKey)

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

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

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

没有mORMot,可以用DISQLite,仅能做单机版的软件,有了mORMot,使用SQLite数据库可以做C/S架构的软件,而且很方便的就有了3Tier, 4Tier。
----------------------------------------------
-
作者:
男 brh616 (风风风) ★☆☆☆☆ -
盒子活跃会员
2016/6/16 8:13:21
65楼: JsonDataObjects, 好的,就是他了
----------------------------------------------
风风风
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2016/6/17 9:14:52
66楼: 感谢楼主测试...
提个小建议:能不能将D7+FastMM+FastCode的测试结果给放一下?感觉D7的性能在FastCode的支持下处理字符串应该快很多很多...
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 ricky001 (小枫) ★☆☆☆☆ -
盒子活跃会员
2016/6/18 1:50:39
67楼: 看起来delphi越搞越复杂了,以后可能要脱离RAD主旨了
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/18 17:05:48
68楼: 淌过一个大坑!
mORMot 例9 AddURL 到httpsys后没有RemoveURL, 导致iis启动老是报503错误 Service Unavailable。费了好大劲,始终找不到导致错误的原因。只在80端口出错,换一个端口就OK,估计是mORMot导致的。用 netsh http delete urlacl url=http://+:80 清除后故障排除。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/6/18 17:25:12
69楼: 也可以用这个试试,图形界面,比较直观。。。涉及http.sys,高性能的同时也有高风险,小心再小心。 @c5soft
此帖子包含附件:crystalmoon_201661817257.rar 大小:1.33M
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/6/18 17:26:11
70楼: 界面如图
此帖子包含附件:
PNG 图像
大小:25.3K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/18 18:40:15
71楼: 这个好东西。留下。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/18 21:40:23
72楼: 鉴于http.sys的高效,今天想看看Win10下的IIS啥样,尼玛,烦死人,你要买一瓶矿泉水,却进了一个大百货商场,东逛逛西逛逛,就是不知道水放在哪里。这就容易明白Apache与Nginx为什么把http server市场份额大部分都拿走了。这么多机关,随便哪个环节出了问题,服务器就不干活了。这不得不佩服mORMot的作者A.B.直接取其精华,去其糟泊。
----------------------------------------------
-
作者:
男 ivvn (奔腾的心) ★☆☆☆☆ -
普通会员
2016/6/20 11:46:19
73楼: 21楼 是m大?
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/21 13:56:46
74楼: 讨论mORMot,可以到http://wedelphi.com/f/93/,这里开辟专栏。
----------------------------------------------
-
作者:
男 zhyhui2008 (huizi) ★☆☆☆☆ -
普通会员
2016/6/22 14:38:18
75楼: 讨论mormot,可以加入QQ群 289501953 ,大家共同学习
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/6/22 15:56:52
76楼: 请问,支持 安卓和 IOS 32+64 吗?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2016/6/22 17:14:45
77楼: 主要用来开发服务器端的,只支持Windows与Linix。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/6/22 17:16:03
78楼: win64 和 arm32 arm64 是否支持?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 lufangyu (伟人录) ★☆☆☆☆ -
盒子活跃会员
2016/6/23 11:32:32
79楼: 回上楼,支持。
----------------------------------------------
-
作者:
男 progray (灰尘) ★☆☆☆☆ -
盒子活跃会员
2016/6/25 17:38:27
80楼: mark
----------------------------------------------
-
作者:
男 bdl1 (bdl1) ▲▲▲▲▲ -
普通会员
2016/6/30 18:45:55
81楼: 值得支持!
----------------------------------------------
-我的博客
作者:
男 delphiexperta (DelphiExpert) ★☆☆☆☆ -
普通会员
2016/7/6 23:41:06
82楼: 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;

我下载c5soft_201667224418.zip ,在Berlink里面调试不成功!!
请朋友帮忙一下,为什么,我编译会出现两个错误:
TDocVariant.New(jo); 编译不过去
_JSon()编译不过去
----------------------------------------------
-
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2016/7/7 14:08:49
83楼: 收藏
----------------------------------------------
-
作者:
男 seefall (Delfy) ★☆☆☆☆ -
普通会员
2016/7/7 15:19:30
84楼: mark
----------------------------------------------
-
作者:
男 zhyhui2008 (huizi) ★☆☆☆☆ -
普通会员
2016/7/19 15:26:43
85楼: 如果用mormot做服务器端,如果通过浏览器访问,带有用户名和密码
----------------------------------------------
-
作者:
男 vmao (毛小毛) ★☆☆☆☆ -
盒子活跃会员
2016/7/20 8:48:25
86楼: 同82楼,我也编译不过去,难道是版本不一致?
----------------------------------------------
-
作者:
男 eastroads (eastroads) ★☆☆☆☆ -
普通会员
2016/12/25 21:54:47
87楼: 支持,好久没关注delphi的新东西了,楼主加油
----------------------------------------------
-
作者:
男 forjoylee (天地无缘) ★☆☆☆☆ -
普通会员
2017/1/7 23:34:09
88楼: 我用200KB的json文档作性能测试,synopse比superobject快60%,JsonDataObjects又比synopse快50%。
----------------------------------------------
这家伙很懒,什么都没有留下。
作者:
男 hellowangyi (hellowangyi) ★☆☆☆☆ -
普通会员
2017/1/8 15:52:39
89楼: 楼主加油
----------------------------------------------
-
作者:
男 llf (天天打) ★☆☆☆☆ -
盒子活跃会员
2017/1/24 10:34:34
90楼: 好东西,就是全英文,那个群也不活路,大家都在研究。
----------------------------------------------
-
作者:
男 foryour (sean) ★☆☆☆☆ -
普通会员
2017/12/1 15:11:24
91楼: mark
----------------------------------------------
-
作者:
男 kylix2008 (kylix2008) ★☆☆☆☆ -
普通会员
2017/12/5 21:02:41
92楼: mark
----------------------------------------------
-
作者:
男 zsjdingbo (hlizard) ★☆☆☆☆ -
普通会员
2017/12/5 23:13:40
93楼: mark
----------------------------------------------
-窥视Delphi
作者:
男 wuxiangyang (wxy) ★☆☆☆☆ -
盒子活跃会员
2017/12/8 11:29:04
94楼: 赞楼主,学习了!
----------------------------------------------
-
作者:
男 hzw008 (新心晨曦) ★☆☆☆☆ -
盒子活跃会员
2018/1/3 11:21:19
95楼: mark
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2018/5/4 13:37:28
96楼: mORMot,目前似乎适合做高效率的中间件,但客户端开发这块,好像与FireMonkey/android/ios结合不够,所有普通delphi开发人员真要用mORMot做手机app,还真要出身黑汗。而且,mORMot的delphi组件化理念不强,代码与普通objectpascal风格差别太多。
其实datasnap rest虽然低层是indy,但也使用了http,sys,并发性能虽然比不上mORMot,但封装得比较完整,与android/ios结合比较好,如果结合firedac,增加倾听线程数、调整线程池大小、开启数据库连接池pooled、使用firedac的arraydml功能,能够大幅提升默认状态性能,可很好地完成大多数开发。
----------------------------------------------
-
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2018/5/4 15:30:05
97楼: 楼上的,mORMot不讲组件化开发,用的是微服务模块化,面向服务,ORM等概念。

服务器端,mORMot支持Delphi和FPC,而客户端:
- 凡是Delphi支持的平台都支持,包括MacOS, Android和iOS,
- 支持FPC/Lazarus
- 支持 SMS (Smart Mobile Studio)

详见:http://blog.synopse.info/post/2014/08/11/CrossPlatform-Clients/Delphi-FreePascal

关于DataSnap跟mORMot的性能及稳定性比较,12年底有个巴西人做了全面的测试,发现了DataSnap的稳定性和性能问题,因为mORMot太过突出,引起热论,还引起Delphi产品经理的关注并且做了一些产品上的改进,但是根据社区的反抗,问题未能全部解决。
详见:https://robertocschneiders.wordpress.com/2012/11/22/datasnap-analysis-based-on-speed-stability-tests/
----------------------------------------------
-
作者:
男 vga (vga) ★☆☆☆☆ -
盒子活跃会员
2018/5/5 6:35:54
98楼: mORMot 太厉害了!!!!!!!!!!
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/5 9:55:44
99楼: 快2年的老帖子了,既然又冒出来。顺便给大伙再写点东西。
1.mORMot基于ORM那一套一直没用起来,习惯了直接写SQL语句,让A.B.来帮咱写SQL语句仍然没有把握。
2.基于http.sys的服务器已经用于生产环境。整个框架前端用Sencha(Extjs)或WYSIWYG Web Builder来做页面,通过json与Delphi写的后端交互。后端从“09 - HttpApi web server”为起点,等于静态文件服务已经有了。为了动态业务逻辑处理,自己写了Session管理相关代码。JSON先用JsonDataObjects来做,为了能在Delphi7下跑,后来改成TDocVariant,两者的性能差不多。数据库先是用ADOInt,注意,不是ADODB(TADODataset),而是直接调用_Connection,_Recordset等,不用TDataset,稳定性与性能都更好。后来,看到mORMot作者的对ZEOS的赞赏,数据库改用ZEOSLib,也是直接绕开TDataset(因为不需要绑定数据控件),直接用IZConnection,IZResultSet,方便对多种数据库的支持。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/5 10:28:39
100楼: Delphi写的基于http.sys的web服务 PK Nodejs写的web服务
1.性能上来看不分伯仲。AJAX数据返回以100ms为快慢的分水岭,如果能在100ms以内返回数据,用户体验就会非常快,在同样配置的机器上两种框架都能在50ms左右返回前端需要的json数据。
2.发布的简便性delphi优于nodejs。delphi的服务就是一个exe,经aspack压缩不到1M,而Nodejs后台服务达到150M。
3.系统安全性delphi优于nodejs。delphi的服务在一个exe文件中,即便服务器受到攻击,黑客也很难串改exe里面的机器码,而nodejs在服务器上放的是javascript写的源代码,即便混淆了,业务逻辑也是容易梳理,并方便串改。
4.可移植性nodejs优于delphi。要把服务迁移到非windows操作系统下,nodejs容易得多,javascript写的东西几乎不做修改就能在不同平台上跑。理论上讲mORMot可以用freePascal来编译,移植到Linux,这个本人没搞过,不知道这条路上有多少坑。
此帖子包含附件:
JPEG 图像
大小:63.0K
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/5 10:42:38
101楼: 用delphi来写web服务还有一些额外的好处,比如,可以用fastreport来做报表打印,能用XlsGen来做excel数据下载。这些都是用nodejs很难搞的。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/5 10:46:07
102楼: 另外,用mORMot框架实现https服务,有一个复杂的配置,看看这里:
https://wedelphi.com/t/419984/
----------------------------------------------
-
作者:
男 glwang (glwang) ★☆☆☆☆ -
盒子活跃会员
2018/5/5 15:38:11
103楼: @c5soft (大道至简) 楼主能否把你的ASPACK发一份 377132866@qq.com 谢谢!
----------------------------------------------
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2018/5/5 16:05:41
104楼: 我这有
此帖子包含附件:hwkjzyh_20185516541.rar 大小:189.2K
----------------------------------------------
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2018/5/5 17:12:51
105楼: @c5soft,mORMot的ORM非常可靠,我这边有个连锁超市管理软件基于mORMot,多门店同步啥的,用了几年了。

mORMot包含很多模块,而你从http server部分自己建造相关功能也未尝不是一种方法,也正好说明了mORMot的灵活性。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/5 18:52:03
106楼: 哪位仁兄有 mORMot Enhanced System Run Time for Delphi 7 and Delphi 2007 源代码?
https://synopse.info/forum/viewtopic.php?id=23
----------------------------------------------
-
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2018/5/6 0:05:13
107楼: 好像是从这里下载:http://blog.synopse.info/post/2010/01/18/Enhanced-System-Run-Time-for-Delphi-7-and-Delphi-2007
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/6 6:36:08
108楼: 这个是修改原代码的工具程序,需要有borland delphi的原厂安装盘,重新安装。哪里有delphi 7的原厂安装盘? 估计多数人手里都是Delphi7_Lite_Full_Edition。原版的不好找了。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/6 8:04:48
109楼: 找到了delphi7原版CD,应用mORMot的补丁工具,得到修改后的源代码:

  Enhanced Run Time library for Delphi 7 - Delphi 2007
  ----------


  Purpose of these files is to provide speed and bug corrections to the 
  Run Time Library and the VCL of Delphi 7 and 2007. 

  Written by Arnaud Bouchez in 2008-2010
  http://synopse.info



 1. Copyright

  Original Source code remains on following copyright:
    Copyright (c) 1988, 2001 Borland Software Corporation

  A.Bouchez disclaims copyright to the modifications made to the original code.
  In place of a legal notice, here is a blessing (from SQLite3 licence):
    May you do good and not evil.
    May you find forgiveness for yourself and forgive others.
    May you share freely, never taking more than you give.


 2. Installation

  These files are hacked low-level source code, extracted from the original 
Delphi 7 and 2007 run time libray and VCL.

  In order to install them, you MUST have a true Delphi 7/2007 installation in your 
PC, then launch the SynopseRTL.EXE file. This file will check for the Delphi source
files and ask for a destination folder. Keep the destination Directory name short 
(aka D:\Dev\Lib) for easy maintenability. Then launch syscomp.bat to compile 
the enhanced special System.dcu and SysInit.dcu files.
  The original source files are needed: this installation package only contains
the diffs made to these files.

  In order to use the enhanced files, you must change your Delphi settings, and
place the new files to be look up by the Delph compiler BEFORE the default ones 
(in C:\Program Files\Borland\Delphi7):
 - for the IDE, make sure that the new directory (e.g. D:\Dev\Lib) is the FIRST 
in all paths ("Library" tab of the global Options), before $(DELPHI)\Lib: a 
valid parameter is "d:\dev\lib;$(DELPHI)\Lib;$(DELPHI)\Bin;...." or
"d:\Dev\Lib;$(DELPHI)\source\vcl;$(DELPHI)\Source\Rtl;...."
 - for the command line compiler, change the dcc32.cfg -u flag content in the
C:\Program Files\Borland\Delphi7\Bin directory into this:
 -ud:\dev\lib;"C:\Program Files\Borland\Delphi7\lib"
or use a custom bat file file the proper -ud:\dev\lib command line to dcc32.exe

 These files are needed for the Synopse SQLite3 framework to compile. If you
don't want to hack your compiler, copy System.dcu and SysInit.dcu files into your
Synopse SQLite3 framework program directory.

 I managed to get this RTL work with Delphi 2007. Only System.pas and SysInit.pas
are supplied (and needed) for Delphi 2007. Even if some John O'Harrow or Pierre 
Le Riche modifications are already included in Delphi 2007, some of my tricks are
unique and could be usefull (see below).
 Only Delphi 7 and Delphi 2007 patches exists till now, since I need the original 
source files, in order to create the patches (by design). :)

 Enjoy!


 3. System.pas enhancements (Delphi 7 and Delphi 2007)

  - included John O'Harrow version of move() fillchar() Pos() Val() and Int64 math
  - included Pierre Le Riche fast _LStrCmp() implementation
  - deprecated Japan Nec computer bug prevention under Win95 is removed
  - shortstring delete() copy() now use move() and not slow "rep movsb/movsd"
  - borland memory manager is removed and replaced with windows heap manager:
    we recommend using FastMM4 explicitely for VCL applications (as Delphi 2009),
    and leave as it is for smaller executables (e.g. for LVCL; the windows
    heap manager is slower than FastMM4, but sufficient for GUI small apps)
  - there is an optional FastMM4 memory manager inside our getmem.inc, which can
    be enabled by undefining HEAPMEMMANAGER conditional in getmem.inc:
    this FastMM4 shares its memory for the same process with external .DLL
    (if both EXE and DLL are compiled with undefined HEAPMEMMANAGER conditional)
  - some common functions implemented in asm (_Getmem, _Freemem, IOResult...)
  - very common internal basic methods rewritten or improved:
    TObject.NewInstance/InitInstance/InheritsFrom/_AfterConstruction/
    GetDynaMethod/ClassName...
  - on new multi-core CPU, avoid lock asm usage for strings and dynamic arrays
    if no TThread is used (default $define AVOIDLOCK): faster with high-end PC
  - record and object initialization and finalization rewritten for speed:
    _InitializeArray, _FinalizeArray, _InitializeRecord, _FinalizeRecord
  - resourcestring are cached (default $define LOADRESSTRINGCACHED)
  - resourcestring can be translated on the fly with the global
    LoadResStringTranslate procedure pointer (this feature is used in the
    SQLite3i18n unit)
  - widestring allocation can be cached (if $define CACHE_WIDESTRINGS is set)
    (with Vista, the caching is always disabled, since this OS is much faster
    than the previous) but you must call explicitely InitWideStringOptimize
    to launch caching, in order to use the right heap manager (if you intend
    to use FastMM4 e.g.)
  - asm code: 'rep ret' optimization avoid branch misprediction for AMD64 CPUs
    http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25112.PDF
    see '6.2 Two-Byte Near-Return RET Instruction', page 128
  - asm code XOR reg32,reg32 + MOV reg8,* is changed to faster MOVZX reg32,*
  - a special version is compiled with the LVCL define flag, for even smaller code
  - Linux/Kylix compatibility:
    . can be compiled with the command-line compiler (tested with crosskylix)
    . codepage is fixed to ISO-8859-1: widestring is available with configuration
      like LANG=*.UTF-8, which is the standard nowadays for modern distros


 4. SysUtils.pas enhancements (Delphi 7 and Delphi 2007)
 
  - NormToLower[] and NormToUpper[] tables to fast character case conversion
  - TwoDigitLookup[] table for fast 0..99 to '00'..'99' conversion
  - HexChars[] for fast 0..15 to '0'..'f' conversion
  - Ansi*() functions use NormToLower[] and NormToUpper[]:
  call i18n unit and i18n*() functions for using current locale
  - some common functions are faster than default Borland's implementation:
    CompareText() SameText() UpperCase() IntToStr() DecodeTime() DecodeDate()
    StrLen() StrComp() StrIComp() StrEnd()
    and avoid use of slow PIC specific code or lodsb/stosb asm opcodes in asm


 5. Classes.pas enhancements (Delphi 7)

   - faster TReader.Read() and TCustomMemoryStream.Seek()
   - faster TList.Get(), TCollection.GetItem() and TStringList.Get()
   - under Linux, avoid variants usage for speed up and code size

 
 6. Contnrs.pas enhancements (Delphi 7)

   - faster TObjectList TComponentList TClassList Items[] read property


 7. ComCtrls.pas enhancements (Delphi 7)
  
   - fix the VCL TDateTimePicker checkbox handling bug for Windows Vista


 8. Grids.pas enhancements (Delphi 7)

    - fix issue: Grid flickers with active theming
    - use XP Themes for fixed cells if enabled


 9. Printer.pas enhancements (Delphi 7)

  - allows raw customization of low level parameters:
  . create a TPrinterNew instance instead of a TPrinter
  . access to color/black&white or duplex mode e.g. with PrinterNew function
  . we have to subclass TPrinter inside this unit, because Borland
    made the key properties and methods of the class private :( 


 10. IniFiles.pas enhancements (Delphi 7)

  - faster hash implementation (in asm) - exact same hashing algorythm and value
  - round Hash buffer Size to a power of two (faster hashing calculation)


 11. TypInfo.pas enhancements (Delphi 7) 

  - under Linux, avoid variants usage for speed up and code size
此帖子包含附件:c5soft_2018568448.rar 大小:432.3K
----------------------------------------------
-
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2018/5/6 11:04:08
110楼: @c5soft, 你安装D7有没有安装 7.1和7.11 update? 我记得好像有这两个更新的。
----------------------------------------------
-
作者:
男 c5soft (大道至简) ▲▲▲▲▲ -
普通会员
2018/5/6 15:18:07
111楼: 装不装7.1 Update对mORMot的编译没有影响,要获取mORMot Enhanced Run Time library for Delphi 7的源代码,先不要装update。
----------------------------------------------
-
作者:
男 glwang (glwang) ★☆☆☆☆ -
盒子活跃会员
2018/5/7 9:26:35
112楼: @ hwkjzyh (汉卿) 谢谢!
----------------------------------------------
作者:
男 laimama_1 (苞谷) ★☆☆☆☆ -
盒子活跃会员
2018/6/3 18:51:32
113楼: 问各位老大一个相关的问题:我的服务器是MSSQL,有个表中的字段是bit格式,通过synDBDataSet读出来却是largeInt了,这就没法更新了呀。初学者,谁给点帮助?
----------------------------------------------
-
作者:
男 szlbz (秋风) ★☆☆☆☆ -
盒子活跃会员
2018/6/4 9:57:45
114楼: MSSQL表中的字段是nvarchar格式,内容为null时通过synDBDataSet读出字段类型为wideMemo
----------------------------------------------
-
作者:
男 laimama_1 (苞谷) ★☆☆☆☆ -
盒子活跃会员
2018/6/5 21:46:17
115楼:
MSSQL表中的字段是nvarchar格式,内容为null时通过synDBDataSet读出字段类型为wideMemo



用的是dbgrideh吧,把DrawMemoText设为true就行了,你这个不是类型错误。
我今天发现mORMot还会把MSSQL的text类型识别为nvarchar,也不能提交更新了,昨天发现是把Bit类型识别为largeInt,还有其它的吗?
----------------------------------------------
-
作者:
男 szlbz (秋风) ★☆☆☆☆ -
盒子活跃会员
2018/6/6 8:19:27
116楼: @laimama_1 (苞谷) 没用dbgrid,使用dbedit时会显示widememo,有解决方法吗?
----------------------------------------------
-
作者:
男 szlbz (秋风) ★☆☆☆☆ -
盒子活跃会员
2018/6/6 20:38:30
117楼: MSSQL表中的字段是nvarchar格式,内容为null时通过synDBDataSet读出字段类型为wideMemo,将synDBVCL.pas单元procedure TSynBinaryDataSet.InternalInitFieldDefs按下面的方法修改就可以。

procedure TSynBinaryDataSet.InternalInitFieldDefs;
var F: integer;
    DBType: TFieldType;
begin
  FieldDefs.Clear;
  if fDataAccess=nil then
    exit;
  for F := 0 to fDataAccess.ColumnCount-1 do
    with fDataAccess.Columns[F] do begin
    case ColumnType of
    SynCommons.ftInt64: DBType := ftLargeint;
    SynCommons.ftDate:  DBType := ftDateTime;
    SynCommons.ftUTF8:
      if ColumnDataSize=0 then
        DBType := ftWideString  else    //ftDefaultMemo else
       DBType := ftWideString; // means UnicodeString for Delphi 2009+
    SynCommons.ftBlob:  DBType := ftBlob;
    SynCommons.ftDouble, SynCommons.ftCurrency: DBType := ftFloat;
    else raise EDatabaseError.CreateFmt(
      'GetFieldData ColumnType=%s',[TSQLDBFieldTypeToString(ColumnType)]);
    end;
    FieldDefs.Add(UTF8ToString(ColumnName),DBType,ColumnDataSize);
  end;
end;
----------------------------------------------
-
作者:
男 laimama_1 (苞谷) ★☆☆☆☆ -
盒子活跃会员
2018/9/14 21:58:50
118楼: 又遇到一个诡异的问题:客户端用Tsyndbdataset,服务端是MSSQL2000,字段设定为nvarchar,size为20,第一条记录输入3个字符,提交保存后,第二条记录的相同字段就只能输入3个字符了,再也不能超过第一条记录输入的字符数。如果第一条记录输入10个字符,后面的也就只能输入不大于10个字符,好烦人呀!这是mormot的BUG吗?还是要设置什么?
----------------------------------------------
-
作者:
女 EnriquePrids (EnriquePrids) ▲▲△△△ -
普通会员
2018/10/12 22:42:43
119楼: cap casino games and open no alluvium reward offers, free casino bonus
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2018/10/16 14:12:32
1楼: 与qjson比较,性能哪个快?
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 dacsd (ddd) ★☆☆☆☆ -
盒子活跃会员
2018/12/12 16:35:38
120楼: 难道这个问题就无解了吗?
mormot,链接sqlite3数据库,查询语句 select 数量*单价 as 金额 from t1
出现GetFieldData ColumnType=Unknown.错误。
----------------------------------------------
-
作者:
男 nihao500s (nihao100s) ▲▲△△△ -
普通会员
2019/5/22 16:02:34
121楼: 北京私家侦探
上海搬家公司
私家侦探
----------------------------------------------
-
作者:
男 wuxinxin (wuxinxin) ▲▲△△△ -
普通会员
2019/5/27 23:28:28
122楼: start5 - “mORMot的作者是一位软件工程领域的大师,但不是一个会讲故事故事的人,也就不是一个好老师。这么好的产品,这么厚重的文档,却没有让自己的产品“火”起来。” 

-   mORMot 的作者 Arnaud Bouchez,绝对是一位“神”人,神 - 不仅仅是他在软件工程领域的造诣,他的个人经历更是“神”奇。

从他的LinkedIn 上可以看到, AB 先是上了两年的巴黎高等电子学院 (ISEP - école d'ingénieurs du numérique), 然后去著名的罗马天主教大学 格列高利大学 (Pontifical Gregorian University)和法国图卢兹天主教大学( Institut catholique de Toulouse读了八年的神学, 八年的神学和宗教学, 然后参加了法军部队,做了五年的教军牧师,直到2006年。

然后 2008年 开始mORMot项目。
----------------------------------------------
-
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2019/5/28 17:26:53
123楼: 从github的star数看,从论坛提起频率看,从delphi开源项目的活跃度看,我觉得mORMot起码在英文社区已经算火了,但是用Delphi的比较认不多啊。。。
----------------------------------------------
-
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2019/5/28 17:57:17
124楼: 搞不懂的是为什么作者起这个名字,根本不认识。。。。。改个好听的名字应该好点。。。
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/10/21 19:08:21
127楼: 我擦,这个网站被广告攻陷了?
----------------------------------------------
-
作者:
男 yagesalor (yagesalor) ★☆☆☆☆ -
普通会员
2022/4/20 11:50:36
128楼: 为什么 我的对比结果,依旧还是  jsondataobject  的优势更明显呢
不论是json串,还是大json文件(10.9 mb)
附件中有两种测试结果的截图

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    soTestButton: TButton;
    Memo1: TMemo;
    procedure soTestButtonClick(Sender: TObject);
  private
    { Private declarations }
    testList: tstringlist;
    testVarLoop: integer;
    ///json解析,需要解析文件时,直接将 testList赋值即可
    procedure TestSo; // superobject
    procedure TestJD; // jsondataobject
    procedure TestMJ; // mormotjson
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  synCommons, superobject, StopWatch, JsonDataObjects;

{$R *.dfm}

const
  cstMaxTest = 100000;
  cstFileName = 'FoodLst.cdata';

procedure TForm1.soTestButtonClick(Sender: TObject);
var
  tmp: cardinal;
begin
  testList := tstringlist.create;
  try
    testList.LoadFromFile(cstFileName, tencoding.UTF8);
//    testVarLoop := cstMaxTest;
    testVarLoop := 50;
    Memo1.clear;
    Memo1.Lines.Add('SO 解析开始');
    tmp := GetTickCount;
    testso;
    Memo1.Lines.Add('SO 解析结束,耗时:' + inttostr(GetTickCount - tmp) + ' ms');
    Memo1.Lines.Add('JD 解析开始');
    tmp := GetTickCount;
    testjd;
    Memo1.Lines.Add('JD 解析结束,耗时:' + inttostr(GetTickCount - tmp) + ' ms');
    Memo1.Lines.Add('MJ 解析开始');
    tmp := GetTickCount;
    testmj;
    Memo1.Lines.Add('MJ 解析结束,耗时:' + inttostr(GetTickCount - tmp) + ' ms');
  finally
    testList.free;
  end;
end;

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

procedure TForm1.TestJD;
var
  jo: TJSonObject;
  i: Int64;
  sw: TStopWatch;
begin
  sw := TStopWatch.Create;
  jo := TJSonObject.Create;
  i := 0;
  while i < testVarLoop do
  begin
    jo.S['Name'] := 'This is a Str' + IntToStr(i);
    jo.I['Age'] := i;
    if testList.count > 0 then
      jo.O['List'] := (TJSonObject.Parseutf8(testList.text) as tjsonobject)
    else
      jo.A['List'] := TJSonArray(TJSonObject.Parse('[1,"Hello",5,{"name":"c5soft","age":50}]'));
    if i = 100 then
      memo1.lines.add('JD:' + jo.ToJSon());
    inc(i);
  end;
  memo1.lines.add('JsonDataObject: ' + sw.Stop());
  jo.Free;
  sw.free;
end;

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

end.
此帖子包含附件:
PNG 图像
大小:49.6K
----------------------------------------------
-
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2022/4/20 16:05:25
129楼: @楼上, JsonDataObject确实是最快的,mORMot作者亲自在他的博客做过性能比较并且给出结论.

但JSON只占mORMot全部功能的一小部分, JSON只是mORMot的基础功能, 它主要是ORM, web服务器开发和数据库访问等等.
----------------------------------------------
-
作者:
男 kwer (★★★★★) ★☆☆☆☆ -
普通会员
2022/4/20 16:43:22
130楼: mORMot 好像有Bug  繁体字 比如 {"TEST":"錦秀"} unicode 试一下,提取出来就会是乱码。。。其它都还好,为什么会这样不清楚,还是谨慎使用为好。
----------------------------------------------
==========-==========-==========-==========-==========
     多隆, 给我备一匹最快的马, 我有事要走先~~~
==========-==========-==========-==========-==========
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2022/4/20 17:19:41
131楼: 单纯就 JSON 来说,Delphi 自己的那套,如何?

其实我要的功能仅仅是能够把 Object 转换为 JSON 再转换回来。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2022/4/20 19:13:35
132楼: @pcplayer (pcplayer):
1、Delphi 自己的那套 Object 转换为 JSON 再转换回来,很慢,一秒钟转不了几次,如果不在乎效率是可以,如果服务器端就有影响,JsonDataObject是一秒几十万次甚至百万次,不是一个数量级。
2、Delphi很多基础库都很慢,没办法的事情,只能自己去优化。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2022/4/20 19:39:01
133楼: fdjsondataset性能还行,system.json也蛮好
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2022/4/21 11:37:33
134楼: 请教楼主:

1. mORMot 这个玩意看起来是用来做服务器端的一个大框架。Json 仅仅是它自己打包数据的一个部分代码。理论上 Json 它在这个框架里面可以用其它的库,只不过他自己开发了一个。那么,这个 Json 能从这个大框架里面拿出来单独用吗?也就是它的代码耦合的紧不紧的问题。

2. http.sys 这个玩意,程序直接调用它,我的理解,也就是程序直接占用 80 端口了。那么假设这里要在 80 端口上支持多个域名(虚拟主机),可以实现吗?
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行234.375毫秒 RSS