TStringList.Free为什么如此慢?(50分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
能说一下你的数据每条记录最大占用的空间么, 如果插入时追加, 删除时只做一个标记
速度可以快一些, 释放时只要整块释放就可以了, 也不慢.
 
to 张无忌:你没有明白我的意思,数据从内存和硬盘间转移更加耗费执行时间,
我的程序在服务器上面执行的,30M内存根本不算什么,我需要的是加速执行时间,
是否耗费内存无所谓。

to tseug:记录宽度是不确定的。我现在用StringList,追加和删除的操作速度
都很快,就是觉得StringList的释放速度太慢了 :)
 
这么大的数据量,为什么不用数据库呢????
 
象你的这个 for i := 1 to 1000000 <<== 这么大的基数.还不如
把数据直接存入某个数据库,呵呵,处理快,删除也快

方法2:在a.free的时候,不要用主线程去free.而是新创建一个线程去free,而主线程去处理
free之后 的那句 showmessage(inttostr(gettickcount-t));... 当然,这个方法还得看你
是用在哪种情况下.同时也得注意在接下来使用a时,前面的a.free是否完全
 
我写的不是Mis系统,要求尽可能降低数据库的操作,并在内存占用和CPU占用中取最佳
结合点。

包含1000000条记录的Recordset所占的内存是包含1000000条记录的StringList的一倍以
上。

线程的方法我考虑过,要考虑同步的事情太多,就没有着手了。
 
如果是算法运行完成后释放, 那你就不用管它了....如果是频繁申请释放
最好还是初始化时申请, 结束前释放...
 
那就HeapCreate()
HeapAlloc()
HeapFree()
或者直接用MemoryStream来做,
 
to 张无忌:你怎么还在往这方面考虑? 这只是存储分配的具体问题,用了Heap或者Virual
Mem,我同样需要将分配的内存加到一个TList中索引起来才能对应每条记录,而不是30M一起
分配。
我建议你动手一下,进行一下实际的测试才能得到方案的可行性。
 
我只提我的看法,我的内存不够,才128,装了2000SERVER,速度慢的很,
而且我在测试软件,没空测试30M,我只根据经验来提我个人的看法。
你要速度,就用上面的函数分配一个空间,做一个连表,还怕速度不够,
你又要速度又要方便,那是不可能的,
 
我倒.. 使用时不用线程,而只是在释放的时候用另一个线程释放tform1.a 还要考虑到同步么? 用不着吧!

一个线程,不用考虑同步吧.. -_- 我也不是很清楚你的应用..

说说而已,,不要扁我..
 
to 张无忌: 我自己都搞迷糊了,呵呵!我觉得TStringList的效率应该跟
链表差不多啊,而且根据Capacity动态分配,添加字符串尤其快。

to 淡淡的笑:你说得对,不用考虑同步的,Free之前先置成nil就行了(用FreeAndNil)。
 
没有必要的话,不要频繁的释放

我认为应该使用多线程,虽然复杂,但是出于速度考虑,值得
这我有切身体会
 
接受答案了,分不多,见谅!

我最终还是选择了线程方式,淡淡的笑和张无忌请到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1274472各领取150分。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部