多線程運行程序的目的一般是提高程序運行效率並且能夠提高硬件的利用率比如多核CPU,但是如果我們只有單核CPU並發運行程序會怎樣呢?
我以兩個環境作為對比:
環境A(我本機8c)
環境B(我的雲服務器1c)
分別運行並發、串行需要CPU參與的代碼
這里需要注意,如果我運行Thread.sleep這種代碼,是無法達到效果的,因為sleep時會讓出cpu資源,cpu並沒有參與工作。
上代碼:
@Override
public void run(ApplicationArguments args) throws Exception { CountDownLatch countDownLatch = new CountDownLatch(1); Date begin = new Date(); new Thread(() -> { oneSecTime(); countDownLatch.countDown(); } ).start(); new Thread(() -> { oneSecTime(); countDownLatch.countDown(); } ).start(); while(true){ if(countDownLatch.getCount() == 0){ Date end = new Date(); System.out.println(end.getTime()-begin.getTime()); break; } } Date begin2 = new Date(); long a = 0; a = oneSecTime(); a += oneSecTime(); Date end2 = new Date(); System.out.println("a:"+a+" time:"+(end2.getTime()-begin2.getTime())); } private long oneSecTime(){ long f = 0; for (int i = 0; i < 10000; i++) { for (int j = 0; j < 100000; j++) { for (int k = 0; k < 10; k++) { f++; } } } return f; }
兩個環境之間的差異請忽略,CPU型號本身不同
環境A:
6431
a:20000000000 time:9747
環境B:
5033
a:20000000000 time:56
能夠看出來一點,多核環境下,多線程程序運行速度是較串行快的
但是單核環境下,多線程程序運行速度不快反而慢的多,CPU調度多線程上下文切換等消耗影響很嚴重。
這里簡單記錄一下,以打消自己心中疑惑