为什么java中使用多线程不能明显提高程序效率
转自德问:http://www.dewen.org/q/1334
为什么java中使用多线程不能明显提高程序效率
java多线程之效率讨论
完善
首先,多个线程之间的切换是有消耗的,再次,多线程一般用来执行不同的任务,比如主线程执行核心任务,辅助线程执行附属的任务等,所以有时候多线程并不是为了使程序执行的更快,而是同时执行多个任务。
下面依次对你的问题进行回答:
1.如果仅仅从一个程序的执行的角度上考虑,是对的,既然是单核,其实只有一个物理线程,多线程的程序涉及到线程之间的切换,是有性能损耗的。不过从另一方便来讲,假设系统占用一个线程,你的程序使用单线程,那么你的程序平均下来占用CPU的时间是1/2,如果你的程序是2线程呢?那你的程序占用CPU的时间是2/3,你说会不会快一点呢? 所以说也不是绝对的,具体情况具体分析吧。
2、3和1的情况基本相同,只是情况会好一些罢了。
- synchronized修饰的方法同时只能被一个线程执行,比如有100个线程同时执行到synchronized方法,只有一个线程进去执行,其余的99个必须等待,直到这个线程退出synchronized方法,以此类推。
-
系统线程大多数时间都是空闲的,不能这么算。现代任何一种操作系统都有线程抢占机制,空闲的线程是不会挤占CPU时间的。如果系统线程不空闲,那多半它的优先级比你高,它抢占你,也不存在你两个线程就有优势的说法。所以单核上运行多线程几乎总是比单线程慢。 – 灵剑2012 2012-09-10
这些结论不仅适用于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的话,效率会比顺序执行更低。
你的网络情况怎么样,是不是下载文件的时候特别慢,导致各个线程都在等服务器消息?
你说的“然后在本地解压,最后输出”,是什么意思,你是吧所有的文件都输出到一个文件中,还是输出到不同文件中?如果输出到一个文件中,那线程之间就变成串行操作了。
你的下载的文件都多大,文件的压缩率高吗?测试的时候,cpu使用率如何? – 至尊宝 2012-08-17