多线程的效率问题(论坛帖子)

 
问题: ADO 加多线程,为什么感觉和单线程是一样的 , 我加分! ( 积分: 100, 回复: 13, 阅读: 366 )
分类: 多线程 ( 版主: g622, wjiachun )
来自: wpyzywpy, 时间: 2005-8-7 19:42:00, ID 3159239
[ 显示: 小字体 | 大字体]
我的线程类定义 ****************************
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 数据库。 
 
来自: wzwcn, 时间: 2005-8-7 20:36:20, ID 3159267
delphi 自带的那个 NetChat 例子的多线程我觉得也有点。。。
好象所谓的多线程也是先持行一个线程完了再持行另一个的 ~~~ (或者是我不理解)

哪位高手回答一下 ~~  
 
来自: vvyang, 时间: 2005-8-7 21:49:21, ID 3159275
1 、采用多线程不会提高单 CPU 的处理能力,它多大能耐在那摆着呢;
2
、但是多线程可以提高 CPU 的使用效率,当执行中的任务等待资源时,它就退出 CPU 的占用,让给那些满足运行条件的线程来运行;
3
、各个线程频繁连接、关闭、打开数据库,你这样的 多线程 与单线程相比得不偿失吧。 
 
来自: wpyzywpy, 时间: 2005-8-7 21:18:05, ID 3159298
vvyang:
按你的意思理解,是否我这种情况跟用单线程循环是一样的啦,
不知道那位高手用过,
如真的是这样的话,我 ............................  
 
来自: twosunsun, 时间: 2005-8-13 17:09:29, ID 3165741
我用过采用多线程来保存数据 , 使用 Sql server 数据库 ,ADO 连接方式 ,, 我测试的结果是 : 两个线程比一个线程和三个线程都要快一些 .
我觉得有可能是 :
你在线程中去连接数据库 , 之后仅执行一次查询数据库的操作 , 所以效果不是很明显 . 你如果改成每个线程查询 100 , 也许可以看出两个线程快一些 .  
 
来自: kinneng, 时间: 2005-8-13 17:52:03, ID 3165795
总处理时间都是一样的,甚至因为要不断切换,更慢 
 
来自: wpyzywpy, 时间: 2005-8-14 20:36:56, ID 3166747
注:为了做这个实验,我特意去掉要查询表的 INDEX 的。
to kinneng:
对于 PC 机的处理器、网络的切换时间就算是 1 秒的话,我的一个查询语句就要 10 秒的话,这样一来,我开 10 个线程去分别查这个 SQL 的话,时间上和串行行是没什么两样的都是约 100 秒。我试过开好多个数的线程,时间和串行都差不多。
to twosunsun

我的多个线程查询的 SQL 都是一样的。所以就出现了时间的累加,我用的是 UNIX INFORMIX 数据库。我的这个多线程的程序开了 2 个,每个 10 个线程,结果还是 100 秒,说明和 informix 客户端没关系。但是每个线程的查询 SQL 不同的时候,就能看出多线程比较快了。真实奇怪。 
 
来自: kinneng, 时间: 2005-8-14 22:21:04, ID 3166831
真正的多线程要两个 CPU 才能实现,单 CPU 是切换时间片来模拟。 
 
来自: 行到水穷处, 时间: 2005-9-8 11:13:16, ID 3196249
看了楼主连接 ADO 的用法,我发现我的代码和你的不一样

    ConnStr:=inifile.ReadString('DataBase','ConnString','');
    _ADOConnection.LoginPrompt:=false;
    _ADOConnection.ConnectionString:=ConnStr;
    try
      _ADOConnection.Open;//
这里不一样,请问这样的用法好吗?

要不要改回来??:
    if not _ADOConnection.Connected then
        _ADOConnection.Connected := True;
   
 
来自: sunstone, 时间: 2005-9-10 20:21:36, ID 3200488
ConnStr:=inifile.ReadString('DataBase','ConnString','');
_ADOConnection.Connected := false;
    _ADOConnection.LoginPrompt:=false;
    _ADOConnection.ConnectionString:=ConnStr;
    try
      _ADOConnection.Open;//
这样好 
 
来自: tbarcode, 时间: 2005-9-16 17:27:50, ID 3208330
CPU ,用一个线程就好了。
2CPU
,用 2 个就够了。
真想提高速度,用并行计算机啊。 
 
来自: survival, 时间: 2005-9-19 0:20:35, ID 3209861
  其实,在数据库操作中,单线程也好,多线程也好,决定性能的因素不是程序结构,
真正的瓶颈是数据库的性能:
 
理论上,如果数据库服务能够提供高性能的并行计算(拥有多个处理单元硬件),那么多线程肯定性能要高一些(这时候处理一个请求和处理多个请求所耗费的时间很接近,当然并行任务数量要小于数据库的处理器数量),否则不会有明显的差距。
 
实际上,数据库系统的实现是很复杂的,不同情况下会有不同的表现,要取决于数据库响应请求的方式,比如限制执行线程的 cpu 占用,从而影响不同线程模型的性能表现。
 
如何决定呢?
 
如果是本地数据库,单线程足够了(不要告诉我你用的是 8cpu 的超级机器)
 
如果是远程库,那么复杂操作(比如批量提交数据)可以多线程,而且尽量做到不同线程访问不同的库或者表。尽量避免线程之间的读写冲突。
 
总之,多线程一般不会用于大幅度提升数据库操作的性能(要提高性能,应该从数据库结构和操作方法上下手),尤其非独占的数据库,多线程数据库操作主要目的是避免程序界面失去响应。建议不要在同一时间启动多个数据库操作线程,而是在主线程之外,用一个线程完成数据库操作。
 
罗嗦了半天,不知大家明白了没,说的不对的地方请高手指正。 
 
来自: survival, 时间: 2005-9-19 0:30:36, ID 3209864
实际上,我认为大多数数据库系统在写入同一个库表时,为了保持数据完整性避免产生脏数据,都会对写入操作顺序执行,所以即便有多线程执行的条件(比如多处理器),多线程调用这时候看上去与单线程的也没什么区别。 
 
来自: sxzcm, 时间: 2005-12-5 12:04:42, ID 3285945
我在写数据库频繁的任务中做了测试,在我的本本上,单 CPU SQL 2000
单线程不间歇的写数据,可以做到每秒 14 条的写入速度,此时 CPU 占有 100 %,但是其他操作感觉并不慢。
然后我用多线程写入测试, 5 个线程分别写入,每线程写入一条记录之后,停 20ms ,那么,得到的写入合计速度是每秒 30 条。我把暂停时间换到 10ms 也没有提高。但是 CPU 占有降低到 40 50 %。我的防火墙本身占了 10 %左右。
感觉:多线程还是有些好处。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值