多線程並發一定比單線程快嗎?


 很多時候我們都以為要想處理速度更快,那就多開幾個線程跑!

 確實多線程在一定情況下比單線程更快。

 下面的代碼演示串行和並發執行並累加操作的時間,請分析:下面的代碼並發執行一定比串行執行快嗎?當count的數量增加 1萬 -> 10萬 -> 100萬 -> 1000萬 -> 1億

 1 public class ConcurrencyTest {
 2     private static final long count = 10000l;
 3 
 4     public static void main(String[] args) throws InterruptedException {
 5         for(int i=0; i<10; i++) {
 6             concurrency();
 7             serial();
 8             System.out.println("------------------------------------------");
 9         }
10 
11     }
12 
13     private static void concurrency() throws InterruptedException {
14         long start = System.currentTimeMillis();
15         Thread thread = new Thread(new Runnable() {
16             @Override
17             public void run() {
18                 int a = 0;
19                 for (long i = 0; i < count; i++) {
20                     a += 5;
21                 }
22             }
23         });
24         thread.start();
25         int b = 0;
26         for (long i = 0; i < count; i++) {
27             b--;
28         }
29         long time = System.currentTimeMillis() - start;
30         thread.join();
31         System.out.println("concurrency :" + time + "ms,b=" + b);
32     }
33 
34     private static void serial() {
35         long start = System.currentTimeMillis();
36         int a = 0;
37         for (long i = 0; i < count; i++) {
38             a += 5;
39         }
40         int b = 0;
41         for (long i = 0; i < count; i++) {
42             b--;
43         }
44         long time = System.currentTimeMillis() - start;
45         System.out.println("serial:" + time + "ms,b=" + b + ",a=" + a);
46     }
47 }

測試結果

這是count=1萬的結果,基本上串行要快些

並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
並發 :0ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
並發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------

 

這是count=10萬l的結果,基本上串行要快點點

並發 :4ms,b=-100000
串行:3ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
並發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
並發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
並發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------

 

這是count=100萬l的結果,基本上並發就要比串行要快了

並發 :5ms,b=-1000000
串行:5ms,b=-1000000,a=5000000
------------------------------------------
並發 :3ms,b=-1000000
串行:7ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:7ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :2ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:3ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:3ms,b=-1000000,a=5000000
------------------------------------------
並發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------

余下的讀者可以自己去調試哦。

 

結論

 1.在數量比較小的時候,很明顯串行要比並發更快。

 2.因為數量較小的時候,並發會花費很多時間在線程調度上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM