日期:2014-05-18  浏览次数:21010 次

一个是没用多线程,另一个用了。问题是:同样的代码,为什么多线程中的某几个效率比单线程得还要高?
实现的功能是:逐条读入iis日志文件,把其中客户ip转换成域名,然后写入文件。
多线程的话是用了10个,分块读取,写入各自的文件。

单线程机器是 赛扬3.0, 2G 内存
多线程机器是 赛扬2.8, 1G 内存 

运行的结果是:
  单线程: 从10:00运行到17:47 生成文件1.43M
  多线程:从16:43运行到17:47 生成文件2.86M,其中最快的已经700多K。

读写的代码都是一样的,为什么某个线程的效率也要比单线程的快呢?

------解决方案--------------------
只看cpu主频和内存大小还不够的吧。系统总线、内存速度、硬盘传输速率都要看。多线程对单cpu好像没什么意义。
------解决方案--------------------
探讨
只看cpu主频和内存大小还不够的吧。系统总线、内存速度、硬盘传输速率都要看。多线程对单cpu好像没什么意义。

------解决方案--------------------
多线程对内存要求很高
也不赞同“多线程对单CPU无意义”,系统都是按时间片分配给每个线程,大家都是一样
不过线程越多,在内存中需要保护的现场就越多
------解决方案--------------------
同意二楼的意见,这个程序,CPU运算极少,主要都是关于硬盘寻址的操作,而硬盘的工作量最大。
单线程时,硬盘先等CPU寻址,然后硬盘写,CPU等硬盘写完,再计算下一次读写的地址。。。。。。
而多线程时,CPU首先不会等硬盘,而硬盘也就不用等CPU了。

也就是说,单线程是读一行,写一行,然后再读一行,再写一行,每一步都是等上一步完成再进行下一步;而多线程,是读一行,写一行,同时读了下一行,甚至几行的内容(理论上,读取时间应该快于写入时间吧)。当然这里说的下一行,是下一块的某行,并不是真正的紧跟着的下一行。

说到这里,突然想到,也许有人会说,单CPU的话,多线程其实质还是一次读一条写一条的单步操作吧。我觉得,这个就要说硬盘的缓存问题了。CPU将数据先发送到硬盘缓冲区里,然后写入就不管了,单线程的这个时候,会等写完,而多线程会开始读取了。至于磁盘的工作原理,磁头柱面缓存等等的内容,查阅相关资料吧。硬盘的工作可不见得完全是单线程的。呵呵。

至于说,“某个线程的效率也要比单线程的快”的原因,个人觉得,可能是因为多线程的CPU计算的优先等级逻辑上降低了,IO操作被分配了更多的操作时间吧。