多线程的效率问题(论坛帖子)
2006-11-06 13:13
363 查看
[align=left]问题:用ADO加多线程,为什么感觉和单线程是一样的,我加分! ( 积分:100, 回复:13, 阅读:366 ) 分类:多线程 ( 版主:g622, wjiachun ) [/align] | |
[align=left]来自:wpyzywpy, 时间:2005-8-7 19:42:00, ID:3159239[/align] | [align=right][显示:小字体 | 大字体] [/align] |
[align=left]我的线程类定义**************************** type TtestThread = class(TThread) //自定义线程 protected qry: TADOQuery; Ado: TADOConnection; procedure Execute; override; procedure CreateConnectAdoProc; //创建连接ADO procedure OpenSqlProc; //打开数据集 end; procedure TtestThread.CreateConnectAdoProc; var constr : string; begin Qry := TADOQuery.Create(nil); Ado := TADOConnection.Create(nil); constr := '........' //略 Ado.ConnectionString := constr ; //连接ADO串 Ado.LoginPrompt:= false; if not Ado.Connected then Ado.Connected := True; end; procedure TtestThread.OpenSqlProc; begin if Qry.Connection = nil then Qry.Connection := Ado; Qry.Close; Qry.SQL.Clear; Qry.SQL.Text := strSql; Qry.Prepared; Qry.Open; end; procedure TtestThread.Execute; var strSql : string; begin inherited; FreeOnTerminate := true; CoInitialize(nil); CreateConnectAdoProc;//创建连接ADO strSql := 'select............'; //略 OpenSqlProc; //打开数据集 end; 线程类声明实现结束*********************************** 具体操作************************************* procedure form1.Button1Click(Sender: TObject); begin TtestThread.create(false); TtestThread.create(false); .... .... end; **********************************结束 问题: 如果我用1个线程的话,如果执行后时间是10秒的话, 用2个的话就是19秒,几乎用多少个执行时间和一个的倍数都是一样的, 并没有看出查询效率有多快,我用的是informix数据库。 [/align] [align=left] [/align] [align=left]来自:wzwcn, 时间:2005-8-7 20:36:20, ID:3159267[/align] [align=left]delphi自带的那个NetChat例子的多线程我觉得也有点。。。 好象所谓的多线程也是先持行一个线程完了再持行另一个的~~~(或者是我不理解) 哪位高手回答一下~~ [/align] [align=left] [/align] [align=left]来自:vvyang, 时间:2005-8-7 21:49:21, ID:3159275[/align] [align=left]1、采用多线程不会提高单 CPU 的处理能力,它多大能耐在那摆着呢; 2、但是多线程可以提高 CPU 的使用效率,当执行中的任务等待资源时,它就退出CPU的占用,让给那些满足运行条件的线程来运行; 3、各个线程频繁连接、关闭、打开数据库,你这样的“多线程”与单线程相比得不偿失吧。 [/align] [align=left] [/align] [align=left]来自:wpyzywpy, 时间:2005-8-7 21:18:05, ID:3159298[/align] [align=left]vvyang: 按你的意思理解,是否我这种情况跟用单线程循环是一样的啦, 不知道那位高手用过, 如真的是这样的话,我............................ [/align] [align=left] [/align] [align=left]来自:twosunsun, 时间:2005-8-13 17:09:29, ID:3165741[/align] [align=left]我用过采用多线程来保存数据,使用Sql server数据库,ADO连接方式,,我测试的结果是:两个线程比一个线程和三个线程都要快一些. 我觉得有可能是: 你在线程中去连接数据库,之后仅执行一次查询数据库的操作,所以效果不是很明显.你如果改成每个线程查询100次,也许可以看出两个线程快一些. [/align] [align=left] [/align] [align=left]来自:kinneng, 时间:2005-8-13 17:52:03, ID:3165795[/align] [align=left]总处理时间都是一样的,甚至因为要不断切换,更慢 [/align] [align=left] [/align] [align=left]来自:wpyzywpy, 时间:2005-8-14 20:36:56, ID:3166747[/align] [align=left]注:为了做这个实验,我特意去掉要查询表的INDEX的。 to kinneng: 对于PC机的处理器、网络的切换时间就算是1秒的话,我的一个查询语句就要10秒的话,这样一来,我开10个线程去分别查这个SQL的话,时间上和串行行是没什么两样的都是约100秒。我试过开好多个数的线程,时间和串行都差不多。 to twosunsun: 我的多个线程查询的SQL都是一样的。所以就出现了时间的累加,我用的是UNIX的INFORMIX数据库。我的这个多线程的程序开了2个,每个10个线程,结果还是100秒,说明和informix客户端没关系。但是每个线程的查询SQL不同的时候,就能看出多线程比较快了。真实奇怪。 [/align] [align=left] [/align] [align=left]来自:kinneng, 时间:2005-8-14 22:21:04, ID:3166831[/align] [align=left]真正的多线程要两个CPU才能实现,单CPU是切换时间片来模拟。 [/align] [align=left] [/align] [align=left]来自:行到水穷处, 时间:2005-9-8 11:13:16, ID:3196249[/align] [align=left]看了楼主连接ADO的用法,我发现我的代码和你的不一样 ConnStr:=inifile.ReadString('DataBase','ConnString',''); _ADOConnection.LoginPrompt:=false; _ADOConnection.ConnectionString:=ConnStr; try _ADOConnection.Open;//这里不一样,请问这样的用法好吗? 要不要改回来??: if not _ADOConnection.Connected then _ADOConnection.Connected := True; [/align] [align=left] [/align] [align=left]来自:sunstone, 时间:2005-9-10 20:21:36, ID:3200488[/align] [align=left]ConnStr:=inifile.ReadString('DataBase','ConnString',''); _ADOConnection.Connected := false; _ADOConnection.LoginPrompt:=false; _ADOConnection.ConnectionString:=ConnStr; try _ADOConnection.Open;// 这样好 [/align] [align=left] [/align] [align=left]来自:tbarcode, 时间:2005-9-16 17:27:50, ID:3208330[/align] [align=left]单CPU,用一个线程就好了。 2CPU,用2个就够了。 真想提高速度,用并行计算机啊。 [/align] [align=left] [/align] [align=left]来自:survival, 时间:2005-9-19 0:20:35, ID:3209861[/align] [align=left] 其实,在数据库操作中,单线程也好,多线程也好,决定性能的因素不是程序结构, 真正的瓶颈是数据库的性能: 理论上,如果数据库服务能够提供高性能的并行计算(拥有多个处理单元硬件),那么多线程肯定性能要高一些(这时候处理一个请求和处理多个请求所耗费的时间很接近,当然并行任务数量要小于数据库的处理器数量),否则不会有明显的差距。 实际上,数据库系统的实现是很复杂的,不同情况下会有不同的表现,要取决于数据库响应请求的方式,比如限制执行线程的cpu占用,从而影响不同线程模型的性能表现。 如何决定呢? 如果是本地数据库,单线程足够了(不要告诉我你用的是8cpu的超级机器) 如果是远程库,那么复杂操作(比如批量提交数据)可以多线程,而且尽量做到不同线程访问不同的库或者表。尽量避免线程之间的读写冲突。 总之,多线程一般不会用于大幅度提升数据库操作的性能(要提高性能,应该从数据库结构和操作方法上下手),尤其非独占的数据库,多线程数据库操作主要目的是避免程序界面失去响应。建议不要在同一时间启动多个数据库操作线程,而是在主线程之外,用一个线程完成数据库操作。 罗嗦了半天,不知大家明白了没,说的不对的地方请高手指正。 [/align] [align=left] [/align] [align=left]来自:survival, 时间:2005-9-19 0:30:36, ID:3209864[/align] [align=left]实际上,我认为大多数数据库系统在写入同一个库表时,为了保持数据完整性避免产生脏数据,都会对写入操作顺序执行,所以即便有多线程执行的条件(比如多处理器),多线程调用这时候看上去与单线程的也没什么区别。 [/align] [align=left] [/align] [align=left]来自:sxzcm, 时间:2005-12-5 12:04:42, ID:3285945[/align] [align=left]我在写数据库频繁的任务中做了测试,在我的本本上,单CPU,SQL 2000 单线程不间歇的写数据,可以做到每秒14条的写入速度,此时CPU占有100%,但是其他操作感觉并不慢。 然后我用多线程写入测试,5个线程分别写入,每线程写入一条记录之后,停20ms,那么,得到的写入合计速度是每秒30条。我把暂停时间换到10ms也没有提高。但是CPU占有降低到40-50%。我的防火墙本身占了10%左右。 感觉:多线程还是有些好处。[/align] |
相关文章推荐
- 多线程性能及效率问题
- 多线程性能及效率问题
- 多线程和单线程的执行效率问题
- 多线程和单线程的执行效率问题
- 多线程的效率问题,随便看看...
- 多线程解决for循环效率问题
- 多线程处理与效率问题
- 多线程性能及效率问题
- 整理今天论坛里发出帖子的问题
- 多线程访问文件问题中WaitForSingleObject方法的使用,及其效率!
- 由一个论坛帖子, 解决udp 服务器无法返回数据给第一个客户端的问题
- 多线程二分法查询效率问题求解
- 多线程和单线程的执行效率问题
- C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解
- DDD实践问题之 - 关于论坛的帖子回复统计信息的更新的思考
- 多线程性能及效率问题
- 在论坛发帖应该注意的问题——为什么你的帖子没有人回答?
- DDD实践问题之 - 关于论坛的帖子回复统计信息的更新的思考
- 这是我在逛一个微波论坛的时候看到的一些帖子里面对HFSS仿真的一些问题的解决方法,不一定正确,有不对的地方希望指出,我改正!
- 多线程性能及效率问题