java多线程之效率讨论



为什么java中使用多线程不能明显提高程序效率

转自德问:http://www.dewen.org/q/1334

为什么java中使用多线程不能明显提高程序效率

  •  
  • 0鼠先生0

    11 票

  • 920

应用多个线程同时解析多个文件,比起使用单线程顺序解析这些文件,效率并没有提高 ??

我这里先是读取远程数据库中的文件,然后在本地解压,最后输出。远程数据库是文件数据库

0鼠先生0
编辑于 2012-02-07
评论 ( 6) •  举报 (0) •  分享 •  链接 •  2012-02-06 
  • 0
    试试用线程池 –  曾裕捷  2012-08-16
  • 1
    这个问题很简单,你的瓶颈根本不在内存里的数据处理,而在于你的磁盘IO性能,所以多线程根本起不了什么作用,甚至会导致并发的IO操作而降低性能。 就好比你急着往一个U盘上拷五部电影,你五个文件都复制黏贴,五个对话框同时拷贝,说不定比你一个一个拷贝还慢。。。 –  ronnie  2012-08-16
  • 0
    代@yunnysunny转发
    你的网络情况怎么样,是不是下载文件的时候特别慢,导致各个线程都在等服务器消息?
    你说的“然后在本地解压,最后输出”,是什么意思,你是吧所有的文件都输出到一个文件中,还是输出到不同文件中?如果输出到一个文件中,那线程之间就变成串行操作了。
    你的下载的文件都多大,文件的压缩率高吗?测试的时候,cpu使用率如何?
     –  至尊宝  2012-08-17
  • 0
    一般只用一个线程处理一种IO就够了。 –  灵剑2012  2012-09-10
显示更多隐藏的评论
添加评论...
11个答案
票 数 
  • 崔苔吾

    6 票

  • 7442

我感觉你首先应该明白多线程一些作用;
使用线程的好处有以下几点:
·使用线程可以把占据长时间的程序中的任务放到后台去处理
·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
·程序的运行速度可能加快
·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

你出现的问题就像上面两位前辈所说的,采用文件操作影响了你的效率,你应该改变一下这种机制,变为现在流行的nosql机制,当然这是我个人的建议



java多线程之效率讨论

转自德问: http://www.dewen.org/q/5374

 完善

  •  
  • wavefancy

    1 票

  • 156

在 iteye 上看到的问题,有些困惑,希望在这里能有深入讨论。
原文地址: http://www.iteye.com/topic/1126575

1、单cpu单核的服务器,多线程比顺序执行的程序费时? 
2、单cpu多核的服务器,多线程比顺序执行的程序效率高? 
3、多cpu多核的服务器,多线程一定比顺序执行的程序效率高? 
4、多线程调用被synchronized修饰的方法(该方法处理业务),是不是等同于顺序执行?

我们假设程序的业务不涉及IO等阻塞性操作,就是普通的计算逻辑。

评论 ( 1) •  举报 (0) •  分享 •  链接 •  2012-09-07 
  • 0
    相关问题:为什么java中使用多线程不能明显提高程序效率 http://www.dewen.org/q/1334 –  sonyanda  2012-09-07
添加评论...
3个答案
票 数 
  • qiaoxueshi

    2 票

  • 61

首先,多个线程之间的切换是有消耗的,再次,多线程一般用来执行不同的任务,比如主线程执行核心任务,辅助线程执行附属的任务等,所以有时候多线程并不是为了使程序执行的更快,而是同时执行多个任务。

下面依次对你的问题进行回答:
1.如果仅仅从一个程序的执行的角度上考虑,是对的,既然是单核,其实只有一个物理线程,多线程的程序涉及到线程之间的切换,是有性能损耗的。不过从另一方便来讲,假设系统占用一个线程,你的程序使用单线程,那么你的程序平均下来占用CPU的时间是1/2,如果你的程序是2线程呢?那你的程序占用CPU的时间是2/3,你说会不会快一点呢? 所以说也不是绝对的,具体情况具体分析吧。
2、3和1的情况基本相同,只是情况会好一些罢了。

  1. synchronized修饰的方法同时只能被一个线程执行,比如有100个线程同时执行到synchronized方法,只有一个线程进去执行,其余的99个必须等待,直到这个线程退出synchronized方法,以此类推。

 

评论 ( 2) •  举报 (0) •  链接 • 2012-09-08
  • 0
    系统线程大多数时间都是空闲的,不能这么算。现代任何一种操作系统都有线程抢占机制,空闲的线程是不会挤占CPU时间的。如果系统线程不空闲,那多半它的优先级比你高,它抢占你,也不存在你两个线程就有优势的说法。所以单核上运行多线程几乎总是比单线程慢。 –  灵剑2012  2012-09-10
  • 0
    另外多线程程序主要慢在创建、销毁线程和同步上。不需要算线程切换的消耗,因为你线程再少,一个时间片过去了一个线程切换中断还是要来的,这点时间你挤占不了。 –  灵剑2012  2012-09-10
添加评论...
  • 灵剑2012

    2 票

  • 3650

这些结论不仅适用于Java,也适用于任何编程语言

1、单cpu单核的服务器,多线程比顺序执行的程序费时?
是的。原因在于:多线程程序需要额外创建、销毁线程;多线程程序需要额外的同步(sync或者interlock),同步通常需要syscall进入内核,消耗的代价是非常高的。

2、单cpu多核的服务器,多线程比顺序执行的程序效率高?
只能说如果多线程程序设计的足够好,问题的确适合多线程解决,那么大多数情况下的确多线程效率高。注意我用了很多限定词。一个设计得不好的多线程程序会经常互锁导致大量资源浪费,甚至偶尔发生死锁这种危险情况。这种时候当然不可能比顺序执行效率高。
多线程的另一个问题是cpu对内存的存取。现代cpu中有称为cache的机制,短时间内访问的内存会缓存在L1-L3的cache中,访问速度大大加快;而多线程的程序如果需要多个线程访问相同的内存地址,就会导致cache的效率下降(每个核心都要单独cache);如果多个线程都要写相同的内存,情况会更严重,cpu必须依靠内核间通信来维护cache之间的同步。

单cpu多核和多cpu多核有什么区别?
区别有两点:
1. AMD的某些CPU有共享cache的设计,多个核心会共享某一级别的cache,效率在一定程度上有提高
2. Intel的i系列处理器,在单cpu运行单线程和多线程时,主频是不同的,称为睿频技术。单核双线程模式和单核单线程模式,单线程模式的主频更高一些,这样多线程的优势不如以前那么明显

3、多cpu多核的服务器,多线程一定比顺序执行的程序效率高?
同上,不是的。当然那么多cpu又有那么多核心的话,多线程效率更高的可能性也变大了。

4、多线程调用被synchronized修饰的方法(该方法处理业务),是不是等同于顺序执行? 
不等同,效率会更低。同步机制在线程等待和线程唤醒期间都会有相当大的性能损耗,多线程抢着进sync的话,效率会比顺序执行更低。

 

评论 ( 0) •  举报 (0) •  链接 • 2012-09-10
  • 社区维基

    1 票

  • 1

不讨论I/O操作不合理吧,多线程很多时候是解决阻塞浪费cpu资源的问题。
关于在单线程cpu上提高计算速率不应该从多线程入手,cpu只能在微观上串行执行,只计算能力只有那么多,不会因线程增多而提速。
在多线程cpu上我觉得多线程计算提速是必然的结果,前提是你能同时使用cpu的多个线程处理,提高计算速率还有使用GPU的方法,这个我只是见过,有个解wap 密码的软件就是这么干的)


你可能感兴趣的:(java,多线程,数据库,cache,服务器,任务)