我在一个项目中有大量的数据要处理
  对一个数组进行一定的逻辑运算
 一开始我用单一的过程来处理,大体是这样的
for i:=0 to 7
 for j:=0 to 100
    {
   处理过程
   }
耗时大约为40ms
我想再次优化所以我把处理过程分为8 份建立8个线程来处理
每个线程负责处理一部分数据,结果耗时为50ms左右,反而更慢;
这是为什么呢???? 难道多线程更没效率?????

解决方案 »

  1.   

    请问你有多少个CPU?
    如果是一个的话,都是他干,还多干了点线程的活,不应该慢点吗?
      

  2.   

    看你怎么组织你的代码了,和cpu个数关系不大,不然多线程操作系统就没任何意义了。
      

  3.   

    只有一个CPU的情况下,多线程的作用是当你和一些慢的外设交换信息时可以节省很多时间
    就你的例子来说,你的数据估计都在缓存中,所以多线程还多耗用了操作线程的时间
      

  4.   

    如果设计得很精确的系统的话使用单CPU的机器,多线程当然会将低效率。但是在现实情况下,非常精确的系统难于设计,使用多线程的可以使得软件系统设计简单得多。
    使用多CPU的情况下,可以提高效率。
      

  5.   

    能不用多线程,尽量不要用,单Cpu系统多线程不会带来效率的提升。
    用多线程只是为了让某些操作在后台执行,不影响前台的操作,当然是以牺牲效率为代价的。
    另外 trainbox(rain)也说了,和一些慢的外设交换信息时可以节省很多时间,因为你的CPU处理能力大大强于某些外设,如打印机,扫描仪等等,那么我们同时打印和扫描,CPU完全可以处理,那就比先打印再扫描快了。
      

  6.   

    按我的理解,多线程在个数一定的时候(按delphi帮助说明一般一个进程开少于16个线程比较有效率)执行效率肯定比单个地要好.那就是为什么用网络蚂蚁下载比一般的另存为要快的原因.
    而且有关的资料显示,在处理数据时,同时开几个线程并行处理理论上要比单个处理有效率.但我实际的项目中并不是这样,有点不可理解.
    其实测试比较简单,(在我的项目中是这样的)建立一个二维的数组,比如1000X1000,
    然后对这些数组进行处理.
    请各位有空可以试试看.
      

  7.   

    网络蚂蚁快是因为服务器限制了每个线程的下载速度,用多线程当然快了。不信你在局域网做个FTP下载试试看,网络蚂蚁并不快。这也是现在很多服务器限制每个IP下载线程数的原因。你的情况不一样,你是因为CPU的处理能力不够,用多线程只会适得其反,而且增加了编程的难度和出错的可能性,不可取。
      

  8.   

    除了最新的那个什么超线程P4CPU(在XP里你会看到有2个CPU,可惜假的),其他CPU都不能同时执行几个线程,都是交替执行,只是因为他快,给人的错觉就是同时执行。不过很快就有双核心CPU用了,那时候你用2线程应该会快很多。
      

  9.   

    to: miky(miky) ( ) 下载文件对于CPU来说就是相当于一个缓慢的外设,这个和CPU的处理能力是无关的
      

  10.   

    在一个CPU里,一次只能执行一条指令所以呢,多线程对单个CPU的系统来说是一个真实的谎言
      

  11.   

    多线程并不一定是高效的我曾开发的LYProxy,作为研究的使用单线程的代理服务器,仅有一个线程就能处理多个连接请求,发现他的效率没比多线程的差所以多线程并不一定就好,需要看场合的,以后的双内核CPU就有用了,现在的基本都是单U机,没明显作用当然,例如网络下载,如果是对方限制单一线程的速度;或因为路由的不同导致速度有快慢等,那就有用的http://lysoft.7u7.net
      

  12.   

    多线程在多CPU的情况下可以显著提高效率
    单CPU的情况下
    是将CPU的空闲时间给非主线程或较低优先级的线程使用
    但同时带来一些消耗的问题
    比如线程的创建,分配资源,同步等待
    所以设计不合理的线程反而效率更差
    只有当要处理的过程非常耗时才使用线程
    如果不是很耗时
    可以采取其他的技巧让程序看起来不是很耗时
      

  13.   

    多线程只是为了解决并发问题,并不是单纯为了提高效率同意这种大量数据处理的程序,多线程绝对比单线程慢(一个CPU 的情况下)
    多线程主要是解决并发问题
    如何你想一边做某事(前台操作)
    又一边处理什么(后台)
    这样才用多线程。如果你最大耗时才 50ms 就用不作多线程了。
      

  14.   

    本人不太同意,这个说法!
    比如你有一个执行文件,其中有一些数据计算,我们假设其耗时为20ms,你同时再打开一个他的实例,他的数据计算时间会变成30或更多吗?????
    可能表过不是很清楚,见谅!
    我觉得如果CPU处理能力足够强,我们假设其能力值为100,此时如果有一个计算过程,其需要的处理能力为20,我想CPU不会把100%的处理能力完成给他吧.
    如果再开多一个实例也不过增加了20,CPU完全有能力在时间片中完全处理,不会有更多的延时.
    不知当否????
      

  15.   

    在线程切换时需要一定的CPU开销,所以一般尽可能少用线程。在以下情况可以适当采用线程
    用异步操作减少用户等待时间,例如Outlook Expresss是轮流收每一个帐号的邮件,而Outlook 2003是同时收取所有帐号的邮件
    用异步操作减少用户取消操作之前必须等待的时间,例如资源管理器在用户短时间内选择多个目录节点时只显示最后一个目录的内容
    用异步操作抢占服务器资源,例如多线程下载。
      

  16.   

    多线程解决的总体效率还是单个任务的效率要看实际情况。一般来讲,单CPU计算机在线程的应用上是为了与其他慢速的外部设备有条理地运行而采用的。譬如打印机、调制解调器等。楼主的问题不存在这种情况,须知,无论要做多少任务,像楼主这样的程序都得由这个CPU完成。多线程只能增加创建、析构这些线程的负担!  故线程技术的应用数否能够提高效率,还要应事而异!