上QQ阅读APP看书,第一时间看更新
1.18 多核CPU不一定比单核CPU运行快
CPU在线程上进行上下文切换的时间成本非常高。当多线程在执行计算密集型任务时,比如类似while(true){}这样的任务,则多核CPU的执行效率反而会慢一些。因为多核CPU需要处理内存中的共享数据以及多核CPU之间的通信和任务的调度等,而单核CPU在执行这种计算密集型任务时相当“专注”,没有多余的操作需要处理,所以执行效率反而快了。
可以在虚拟机软件中指定使用的CPU的核心数量。
创建测试项目one_more_core_diff。运行类代码如下:
package test; import java.util.concurrent.atomic.AtomicLong; class MyThread extends Thread { public void run() { long beginTime = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { double doubleNum = Math.random() + Math.random() + Math.random() + Math.random() + Math.random() + Math.random(); } long endTime = System.currentTimeMillis(); long useTime = endTime - beginTime; Test1.mylong.addAndGet(useTime); } } public class Test1 { public static AtomicLong mylong = new AtomicLong(0); public static void main(String[] args) throws InterruptedException { MyThread[] threadArray = new MyThread[10]; for (int i = 0; i < threadArray.length; i++) { threadArray[i] = new MyThread(); threadArray[i].start(); } for (int i = 0; i < threadArray.length; i++) { threadArray[i].join(); } System.out.println("耗时:" + mylong.get() + "毫秒"); } }
单核CPU运行环境的耗时如图1-76所示。
图1-76 单核CPU运行耗时
图1-77 多核CPU运行耗时
多核CPU运行环境的耗时如图1-77所示。
出现上下文切换的时机可以是CPU时间片使用结束,有更高优先级的线程等待执行,出现垃圾回收,调用了sleep、join、yield、wait、synchronized等操作。当出现上下文切换时需要记录当前线程的执行状态信息,以便在未来继续执行时根据此状态信息进行恢复,而记录线程运行状态信息非常占用CPU资源,导致运行效率降低。