DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: potterchen
今日帖子: 34
在线用户: 21
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 7:57:45
标题:
吹得神乎其神的RTC,性能居然这么差。 浏览:1546
加入我的收藏
楼主: 神器RTC性能这么差,简直难以置信,拉2万笔资料居然要六秒,
拉个十万笔居然直接报错了?
用firedac开发的三层拉20万笔也只要3秒。
相差太大了,看来只有放弃了。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 8:09:16
1楼: 因为一些原因不可以做分页浏览。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 9:35:01
2楼: 请教各位大哥,
我用的是rtchttpserver和rtchttpclient配对。
是否有其它组合可以提升性能,
比如rtcserver配rtcclient?
有点标题党了,不好意思,这里给大伙道歉。
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2023/11/2 10:56:25
3楼: 用firedac开发的三层拉20万笔也只要3秒。
----- 20万笔3秒??  你一笔就三个字段一丢丢数据吗,  我没见过ERP20万笔能3秒取下来
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2023/11/2 11:00:03
4楼: 我对必须一次性拉取20W笔数据的需求很感兴趣
能不能展开说说?
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 11:16:59
5楼: 用固态阵列确实可以做到的,这个倒真没吹牛。
我说拉20w笔,只是打个比方,因为要把所有数据拉下来做实时过滤。
所以才这样做。
当然先拉下来之前可以限定条件。但限定条件之后就不再分页了,不方便过滤查看。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/11/2 11:47:38
6楼: 20w笔是什么意思,取是20w条记录吗?还是写20条记录?还是更新20w条记录?一条记录多大?
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/11/2 11:55:14
6楼: 那是你不会用RTC,RTC肯定比datasnap+FireDac性能高,但至于firedac直连数据库,那得看具体场景,一般直连要比中间件速度快。
在中间件中,RTC其实只负责在服务器客户端传送参数和数据集。
1、rtc服务器上连接数据库firedac,这个连接有连接池功能,如果要跨平台用unidac,也有连接池功能;
2、在服务器上建立查询函数对象,客户端调用此函数,把sql语句从rtc客户端发送至rtc服务器,查询由服务器的fdquery执行,然后rtc把delphi的数据集FDQuery转化为rtc数据集,再把rtcdataset传送至客户端。由于rtc使用了专门的流机制,这种传送是非常高效的。
3、最好要在服务器上建立连接池,这样大概可提高15%的效率。
4、记得加上:
procedure TFMServer.RtcHttpServer1ListenStart(Sender: TRtcConnection);
begin
  if not Sender.inMainThread then
    Sender.Sync(RtcHttpServer1ListenStart);
end;
此帖子包含附件:
PNG 图像
大小:113.4K
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 12:34:50
7楼: @hq200306
是20万条,只是拉取,不是更新。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 12:40:13
8楼: @sxqwhxq
用的是firedac本身api方式调用的三层,没用老式的datasnap.
确实不会用RTC,用的是c5soft大侠的例子测试的。
rtc传数据集慢,慢就慢在这里。
您的方法晚上我再试试,我试着打开多线程,然后客户端查询就报错了。
估计加上你这段代码就正常了。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 12:43:40
9楼: 对于firedac拉20万笔资料3秒,不信的人自己用固态阵列放数据库试试看。
win2008+sql2008+中间层+客户端。主干千M,到桌面百M。
此帖子包含附件:
PNG 图像
大小:95.5K
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/11/2 13:07:46
10楼: 读20w条记录?数据总共有多少兆?
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/11/2 13:55:02
11楼: 那个5soft的代码解决思路有些问题,我专门研究rtc差不多两个月时间,看他自带的demo&help才是正道,现感觉良好。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 14:59:22
12楼: @hq200306
这20万笔大约320M左右。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 15:00:55
13楼: @sxqwhxq
步哥,感谢指点,那我也来看自带的demo。我用的RTC是从github上下的9.52。
可是D11下自带的demo服务端因为用的BDE无法编译,
请问您是怎么解决的?
----------------------------------------------
-
作者:
男 chencong5025 (Nicosoft) ▲▲▲△△ -
普通会员
2023/11/2 15:37:08
14楼: 是否勾选了多线程?
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 16:54:46
15楼: 用c5soft大神的示例默认未用多线程,步哥指点了一下,晚上回去试试再报告。
如果不是考虑跨平台,firedac的三层真的强大。
----------------------------------------------
-
作者:
男 powerpcer (大强) ★☆☆☆☆ -
普通会员
2023/11/2 17:09:30
15楼: 320MB*8 = 2560Mbps = 2.56Gb/s
要3 秒傳完,基本上
1. 資料庫存在SSD 中, 一般SSD 有 540MB/s 的讀取速度
2. Disk 其它的OS 開銷"非常低",可以不計
3. 剩network 傳輸問題, 需要的intranet 有2.5 Gb/s 的實力。
   SERVER 和CLIENT 都是2.5Gb/s 的卡,而且cable 也有2.5Gb/s 實力。
   且中沒有經過router/switch 之類的。
4. Network 的OS 開銷"非常低",可以不計
5. APP 的顯示銷"非常低",可以不計???? 這個就神囉。

如果是我,我絕對是將哪個有事沒事將 320MB 資料回來計算的系統開發者踢出團隊中。
----------------------------------------------
-
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2023/11/2 17:19:28
16楼: 百M到桌面,跑满带宽拉回320MB的数据,也要30秒

正常情况下不应该做一个带锁的Queue,一个线程分批从数据库拉数据进来,一个线程推数据出去做处理么?
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/11/2 19:02:13
17楼: @ andyliuxp (andyliuxp)我不运行只看代码,因为结果已经知道了,bde用不上也罢。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 19:28:12
18楼: @kentty
@powerpcer
不好意思,没说清楚,二位误解了,
我也不是专业开发程序的,
我说的320M是在客户端展开后所占的内存,并不是资料本身所占的空间。
比如原来客户端程序占25M内存,拉完之后吃内存变为355M.
这样的说法,不太严谨。导致二位误解,小弟这里道歉。

小弟的数据,是实测得来的,质疑的朋友可以测试看看。
有时间我来拉一下百万数据,再来报告状况。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 19:34:08
19楼: @sxqwhxq
感谢步兄指点,能否介绍一下单笔超过10万笔资料rtc的表现。
如果不太行我也就不浪费时间来搞这个了。
----------------------------------------------
-
作者:
男 powerpcer (大强) ★☆☆☆☆ -
普通会员
2023/11/2 19:56:42
20楼: 20万笔, 一筆幾BYTES?
但不管如何,我給出來的都是理論上的上限。
也就是說,不會有任何東西能突破的,其它都是你自己的想像。
特別是不管如何,光是一個GRID 你隨便去填一下20萬筆,你要的資料長度就知了。
有可能 3 秒?
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 20:11:58
21楼: @powerpcer
好吧,算一下好吗?
我那个表7个字段,就算它50个byte好了,*200000,再除以两个1024,得出大约为10M,数据,请问3秒有没有可能?
麻烦质疑的兄弟自行测试。
----------------------------------------------
-
作者:
男 powerpcer (大强) ★☆☆☆☆ -
普通会员
2023/11/2 20:24:04
22楼: @andyliuxp.
10MB 的DATA 會被填成 320MB??

好吧, 就照你的意思就好了。
我們計算
1. 
哪你先填完你手邊的GRID吧, 一個簡單的STRINGGRID 即可. 看要幾秒.

2.
另外,你可以開一個DB,只一個 TABLE, 按你的意思, 一欄, CHAR(50),免去其它OVERHEAD 看看它會佔多少?
3.
網路的𨳡銷?
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 20:32:17
23楼: 我只是业余时间玩玩,哪来的营销。
麻烦您自己用firedac api调用方式的三层,自己测试好吗?
我的NET环境是华为三层交换NETwork,服务器千M,客户机百M,
中间服务器就在测试的那台客户机上,这个影响不大,NET开销很小。
grid是用的firepower x2 14。获取到的数据是填充到fdmemtable里面。再连接到wwdbgrid.
他妈的,wang都不准打。
我用stringgrid手动填充试过,差别很小。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 20:35:03
24楼: 有没有大神出来发表下看法,
小弟人微言轻,被这样质疑感觉很委屈。
----------------------------------------------
-
作者:
男 hq200306 (200306) ★☆☆☆☆ -
普通会员
2023/11/2 21:07:20
25楼: 10兆,花不了多少时间,估计就1、2秒,时间耗在数据库上。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2023/11/2 21:23:31
26楼: 所以为什么会有一次性拉20万记录的需求?为什么就不能分页传输?而且还是在手机上?
----------------------------------------------
--
作者:
男 powerpcer (大强) ★☆☆☆☆ -
普通会员
2023/11/2 21:27:34
26楼: 大弟人重(體)言輕,本機,沒特殊處理 LOAD 360MB FIILE,需時 320ms.
幾乎綫性。
如果再轉進MEMTABLE(怎麼轉最快?),再轉到GRID。沒試過。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/2 21:34:33
27楼: 我是在电脑上使用,并不是在手机上,手机上不会这样做。
说真的,我是个菜鸟,大约10M左右的数据拉到客户机上,
为什么内存升到350M左右我真的不明白。
不过我说的情况都是真实的,delphi新的firedac三层开发模式除了不能跨linux外真的很强。

是直接把查询到的结果流直接赋给 fdmemtable,然后datasource,然后wwdbgrid都是自动的了,就算是用stringgrid手动填充。花费时间是差不多的。
我的PC也不好,大约就是14年左右的水平。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2023/11/2 22:03:15
28楼: emm,没用过firedac,不过原始的数据感知组件其实都不会一次性把所有数据加载进内存,原理都是你滑动到某个位置才会加载附近的那前后几十条数据罢了。
而你在使用rtc的时候,则需要在服务端一次性把所有数据都遍历到内存然后再发送出去,这就是最大的差别所在。
不然你可以找一找有没有类似cache这种缓存设置,把所有缓存一起关闭之后,再对比一下试试。
http协议虽然会有冗余数据,但是绝对不可能出现这种量级的差距。我觉得楼主还是要去确定一下为好。
----------------------------------------------
--
作者:
男 denis (Denis) ★☆☆☆☆ -
盒子活跃会员
2023/11/3 8:16:23
29楼: 28楼正解
firedac有个Fetch 每次只拉取50笔记录,改变Fetch一次拉回所有数据试试,
firedac,rtc理论上会有一点差别,但不会很大
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2023/11/3 9:22:26
30楼: 其实你看到的是假像,对控件不做调整的话并不是一次性拉完,grid下拉才会继续拉数据的,中间件则老老实实给你拉完了再传输,你不分页的话
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/3 10:20:22
31楼: 回复楼上的,
我看了一下代码,这部分其实是用的tstringgrid自绘的,并没有用数据感知。
所以跟楼上讲的不搭。
就是说确实三秒拉了近20万笔数据下来并绘制进了stringgrid,且我实时拖动到底部可以证实确实自绘完成了。
此帖子包含附件:
PNG 图像
大小:58.8K
----------------------------------------------
-
作者:
男 szlbz (秋风) ★☆☆☆☆ -
盒子活跃会员
2023/11/3 10:28:09
32楼: 👍🏻
----------------------------------------------
-
作者:
男 denis (Denis) ★☆☆☆☆ -
盒子活跃会员
2023/11/3 11:03:50
33楼: 如此看来,datasnap+firedac确实有过人之处
曾经改过datasnap的通讯,把indy换成synapse和网上下载的最新版的indy,都没有原版的快。
rtc也试用过,最终还是不喜欢放弃了,用diocp改造datasnap,还是datasnap好用
----------------------------------------------
-
作者:
男 szlbz (秋风) ★☆☆☆☆ -
盒子活跃会员
2023/11/3 11:33:57
33楼: 你可以用firedac+rtc测试一下
----------------------------------------------
-
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2023/11/3 12:10:12
34楼: @andyliuxp 
TStringGrid自绘的原理也是在需要的时候调用OnDrawCell把要显示的区域给绘制出来,
而不是一下子把20W行的表格在内存里渲染好,
然后根据需要把某一段丢给屏幕去显示

现在一次性拉取全部20W笔数据,让用户盲等3秒其实用户体验已经不好了
假如后续数据规模扩大到200W笔,让用户盲等30秒几乎是不可接受的
个人建议还是先获取全部的数据笔数来初始化StringGrid(或其他显示组件)的行数,
然后分段从服务器抓数据,抓一次处理一次,有需要的时候更新显示组件

进一步地,
一次性的拖全库操作,从设计逻辑来说就是不可接受的,
数据规模小的时候怎么搞的都行
数据规模大一点,就全是坑

RTC的效率没用过不做评论,
这东西出现也不是一天两天了
按说不应该差这么多,
很可能是某些参数设置没有最优化

供参考
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/3 12:33:50
35楼: @ szlbz
秋风大侠,确实打的这个主意,我怀疑不是RTC的问题,有可能是UNIDAC的问题。
晚上改成firedac连接试试看。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/3 12:36:14
36楼: @KENTTY
只是测试一下极限。真实中不会这样用。

@denis
是firedac api调用方式的三层,非datasnap.
----------------------------------------------
-
作者:
男 smartdata (Jack) ★☆☆☆☆ -
普通会员
2023/11/3 12:47:27
37楼: 20万笔数据的分析处理放服务器上不会更好吗?到客户端来处理,Netware受不了吧。
----------------------------------------------
==========
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/3 15:06:54
38楼: 是要实现类似cxgrid的效果,单击标题栏下拉按钮进行过滤。
NET肯定没有问题的,压力不大。又不会每时每刻这样跑。
----------------------------------------------
-
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/3 15:12:20
39楼: @步惊云,
用您的代码可以开启多线程,但基本没有帮助。
准备按秋风大侠的提示,数据库连接控件改为firedac试试看。
另外bdedemoserver中的tsession,不知道对应改为unidac或firedac该如何实现,
盼步哥指点。
----------------------------------------------
-
作者:
男 powerpcer (大强) ★☆☆☆☆ -
普通会员
2023/11/3 16:50:20
40楼:
你的50BYTES 一ROW,是全都是VARCHAR 之類? 

用最粗暴的方式:
1.
ONE COLUMN,  填20萬ROW STRINGGRID,且STRINGGRID 的SIZE 一開始就FIXED,無需動態增加,也要50ms
2.
像你6 COLUMNS,又假設你的資料無需作TOSTRING 的轉換,固定STRING 的內容。
填20萬筆耗時立即變成 188ms 

如果你資料還需要轉換成STRING,才能顯示,就只能更慢了。

還是哪句老話,請給出各點的耗時即可。不要只給結果。
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2023/11/3 17:12:54
41楼: 如果firedac也有一个fetch可以控制单次拉取的数据的话,那就是这个原理。
或许是我没讲明白吧。
说的通俗一点,就是一般的数据集开打数据之后,不会一口气把所有结果反馈出来,而是会有一个预加载机制。等你访问到某个地方的时候,他才会加载到那之后若干条数据。
最直观的就是去看mssql的查询分析器,以及sql develpoer。加载数据都有一个填充的过程。
你的stringgrid是不是自绘的跟我说的根本就是两回事,窗口显示出来最终都是draw出来的,无论用什么方式去存取数据,数据总归会放在内存里,任何ui window都只是一个展现罢了。

而你用rtc,则需要一次性将所有数据全部加载到内存,然后再一口气反馈给你的前端,这中间就等于把所有加载数据的时间累计在了一起,当然等待时间就更长了。


其实,现代软件,除非你用了个2G,否则主要瓶颈都在数据库上。至少我有十年了吧,至少十年没见过性能瓶颈卡在internet上的。
----------------------------------------------
--
作者:
男 andyliuxp (andyliuxp) ★☆☆☆☆ -
普通会员
2023/11/3 18:02:19
42楼: 先不回复了,
待我把RCT按官方demo调通再测试再来报告。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/11/3 19:21:31
43楼: 花时间看demo吧,我差不多搞了半个月才搞通:数据库增删查改,文件上传下载。要花些功夫的。用datasnap也不错,而且datasnap与firedac深度绑定,在delphi里用很方便,但是要跨语言或跨平台就没办法了。
----------------------------------------------
-
作者:
男 lr46752881 (Anuo) ★☆☆☆☆ -
普通会员
2023/11/15 15:26:12
44楼: RTC是用来搞数据库的吗?

RTC不是轻量级的三层控件而已。

为什么要一次性拉20W条数据呢?难道用户会一眼看20万条么?

搞个分页加载就可以了。
----------------------------------------------
123
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行93.75毫秒 RSS