SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue性能测试

xiaoxiao2021-02-28  117

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://stevex.blog.51cto.com/4300375/1287085

听说JDK6对SynchronousQueue做了性能优化,避免对竞争资源加锁,所以想试试到底平时是选择SynchronousQueue还是其他BlockingQueue。

对于容器类在并发环境下的比较,一是是否线程安全,二是并发性能如何。BlockingQueue的实现都是线程安全的,所以只能比比它们的并发性能了。在不同的应用场景中,对容器的使用情况不同,有的读取操作多修改写入操作少,有的修改写入操作多,这对容器的性能会造成不同的影响。但对于Queue的使用,个人认为是比较一致的,简单点就是put和get,不会修改某个元素的内容再被读取,也很少只读取的操作,那是不是有最佳实践了?

代码比较长,我还是放在后面,先说结论。没有想到的是LinkedBlockingQueue性能表现远超ArrayBlcokingQueue,不管线程多少,不管Queue长短,LinkedBlockingQueue都胜过ArrayBlockingQueue。SynchronousQueue表现很稳定,而且在20个线程之内不管Queue长短,SynchronousQueue性能表现是最好的,(其实SynchronousQueue跟Queue长短没有关系),如果Queue的capability只能是1,那么毫无疑问选择SynchronousQueue,这也是设计SynchronousQueue的目的吧。但大家也可以看到当超过1000个线程时,SynchronousQueue性能就直线下降了,只有最高峰的一半左右,而且当Queue大于30时,LinkedBlockingQueue性能就超过SynchronousQueue。

结论:

线程多(>20),Queue长度长(>30),使用LinkedBlockingQueue

线程少 (<20) ,Queue长度短 (<30) , 使用SynchronousQueue

当然,使用SynchronousQueue的时候不要忘记应用的扩展,如果将来需要进行扩展还是选择LinkedBlockingQueue好,尽量把SynchronousQueue限制在特殊场景中使用。

少用ArrayBlcokingQueue,似乎没找到它的好处,高手给给建议吧!

最后看看测试代码和结果:(Win7 64bit + JDK7 + CPU4 + 4GB)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 import  java.util.concurrent.ArrayBlockingQueue; import  java.util.concurrent.BlockingQueue; import  java.util.concurrent.Callable; import  java.util.concurrent.CompletionService; import  java.util.concurrent.ExecutorCompletionService; import  java.util.concurrent.ExecutorService; import  java.util.concurrent.Executors; import  java.util.concurrent.LinkedBlockingQueue; import  java.util.concurrent.SynchronousQueue; public  class  TestSynchronousQueue {      private  static  int  THREAD_NUM;      private  static  int  N =  1000000 ;      private  static  ExecutorService executor;      public  static  void  main(String[] args)  throws  Exception {                              System.out.println( "Producer\tConsumer\tcapacity \t LinkedBlockingQueue \t ArrayBlockingQueue \t SynchronousQueue" );                                       for ( int  j =  0 ; j< 10 ; j++){              THREAD_NUM = ( int ) Math.pow( 2 , j);              executor = Executors.newFixedThreadPool(THREAD_NUM *  2 );                                               for  ( int  i =  0 ; i <  10 ; i++) {                  int  length = (i ==  0 ) ?  1  : i *  10 ;                  System.out.print(THREAD_NUM +  "\t\t" );                  System.out.print(THREAD_NUM +  "\t\t" );                  System.out.print(length +  "\t\t" );                  System.out.print(doTest2( new  LinkedBlockingQueue<Integer>(length), N) +  "/s\t\t\t" );                  System.out.print(doTest2( new  ArrayBlockingQueue<Integer>(length), N) +  "/s\t\t\t" );                  System.out.print(doTest2( new  SynchronousQueue<Integer>(), N) +  "/s" );                  System.out.println();              }                                               executor.shutdown();          }      }                               private  static  class  Producer  implements  Runnable{          int  n;          BlockingQueue<Integer> q;                                       public  Producer( int  initN, BlockingQueue<Integer> initQ){              n = initN;              q = initQ;          }                                       public  void  run() {              for  ( int  i =  0 ; i < n; i++)                  try  {                      q.put(i);                  }  catch  (InterruptedException ex) {                  }          }      }                               private  static  class  Consumer  implements  Callable<Long>{          int  n;          BlockingQueue<Integer> q;                                       public  Consumer( int  initN, BlockingQueue<Integer> initQ){              n = initN;              q = initQ;          }                                       public  Long call() {              long  sum =  0 ;              for  ( int  i =  0 ; i < n; i++)                  try  {                      sum += q.take();                  }  catch  (InterruptedException ex) {                  }              return  sum;          }      }                               private  static  long  doTest2( final  BlockingQueue<Integer> q,  final  int  n)              throws  Exception {          CompletionService<Long> completionServ =  new  ExecutorCompletionService<Long>(executor);                                       long  t = System.nanoTime();          for ( int  i= 0 ; i<THREAD_NUM; i++){              executor.submit( new  Producer(n/THREAD_NUM, q));          }              for ( int  i= 0 ; i<THREAD_NUM; i++){              completionServ.submit( new  Consumer(n/THREAD_NUM, q));          }                                       for ( int  i= 0 ; i<THREAD_NUM; i++){              completionServ.take().get();          }                                           t = System.nanoTime() - t;          return  ( long ) ( 1000000000.0  * N / t);  // Throughput, items/sec      } }

程序运行结果:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 Producer    Consumer    capacity     LinkedBlockingQueue     ArrayBlockingQueue      SynchronousQueue 1        1        1        154567 /s             154100 /s             3655071 /s 1        1        10       1833165 /s            1967491 /s            3622405 /s 1        1        20       3011779 /s            2558451 /s            3744037 /s 1        1        30       3145926 /s            2632099 /s            3354525 /s 1        1        40       3289673 /s            2879696 /s            3581858 /s 1        1        50       3201828 /s            3008838 /s            3600100 /s 1        1        60       3171374 /s            2541672 /s            3922617 /s 1        1        70       3159786 /s            2844493 /s            3423066 /s 1        1        80       3042835 /s            2536290 /s            3443517 /s 1        1        90       3025808 /s            3026241 /s            3307096 /s 2        2        1        141555 /s             135653 /s             2897927 /s 2        2        10       1627066 /s            785082 /s             2908671 /s 2        2        20       2199668 /s            1604847 /s            2937085 /s 2        2        30       2309495 /s            2115986 /s            2922671 /s 2        2        40       2335737 /s            2424491 /s            2942621 /s 2        2        50       2394045 /s            2405210 /s            2918222 /s 2        2        60       2499445 /s            2471052 /s            2881591 /s 2        2        70       2368143 /s            2454153 /s            2914038 /s 2        2        80       2381024 /s            2457910 /s            2937337 /s 2        2        90       2509167 /s            2461035 /s            2789278 /s 4        4        1        138177 /s             138101 /s             2736238 /s 4        4        10       1654165 /s            478171 /s             2693045 /s 4        4        20       2443373 /s            779452 /s             2728493 /s 4        4        30       2646300 /s            1169313 /s            2787315 /s 4        4        40       2755774 /s            1487883 /s            2874789 /s 4        4        50       2774736 /s            1579152 /s            2804046 /s 4        4        60       2804725 /s            1998602 /s            2803680 /s 4        4        70       2797524 /s            2388276 /s            2936613 /s 4        4        80       2887786 /s            2557358 /s            2899823 /s 4        4        90       2878895 /s            2539458 /s            2839990 /s 8        8        1        140745 /s             135621 /s             2711703 /s 8        8        10       1650143 /s            526018 /s             2730710 /s 8        8        20       2477902 /s            798799 /s             2696374 /s 8        8        30       2658511 /s            983456 /s             2783054 /s 8        8        40       2694167 /s            1185732 /s            2677500 /s 8        8        50       2758267 /s            1110716 /s            2766695 /s 8        8        60       2831922 /s            1003692 /s            2762232 /s 8        8        70       2763751 /s            1409142 /s            2791901 /s 8        8        80       2771897 /s            1654843 /s            2838479 /s 8        8        90       2740467 /s            1718642 /s            2806164 /s 16       16       1        131843 /s             137943 /s             2694036 /s 16       16       10       1637213 /s            491171 /s             2725893 /s 16       16       20       2523193 /s            660559 /s             2709892 /s 16       16       30       2601176 /s            899163 /s             2689270 /s 16       16       40       2794088 /s            1054763 /s            2759321 /s 16       16       50       2777807 /s            1111479 /s            2663346 /s 16       16       60       2893566 /s            931713 /s             2778294 /s 16       16       70       2822779 /s            1286067 /s            2704785 /s 16       16       80       2828238 /s            1430581 /s            2724927 /s 16       16       90       2860943 /s            1249650 /s            2791520 /s 32       32       1        132098 /s             130805 /s             2676121 /s 32       32       10       1586372 /s            402270 /s             2674953 /s 32       32       20       2467754 /s            886059 /s             2580989 /s 32       32       30       2569709 /s            772173 /s             2599466 /s 32       32       40       2659883 /s            963633 /s             2677042 /s 32       32       50       2721213 /s            910607 /s             2677578 /s 32       32       60       2779272 /s            861786 /s             2676874 /s 32       32       70       2757921 /s            1111937 /s            2696416 /s 32       32       80       2915294 /s            1323776 /s            2655641 /s 32       32       90       2798313 /s            1193225 /s            2630231 /s 64       64       1        126035 /s             123764 /s             2526632 /s 64       64       10       1539034 /s            394597 /s             2582590 /s 64       64       20       2449850 /s            703790 /s             2598631 /s 64       64       30       2672792 /s            758256 /s             2529693 /s 64       64       40       2797081 /s            661028 /s             2573380 /s 64       64       50       2789848 /s            1162143 /s            2659469 /s 64       64       60       2726806 /s            1145495 /s            2567020 /s 64       64       70       2731554 /s            1359939 /s            2607615 /s 64       64       80       2871116 /s            1305428 /s            2494839 /s 64       64       90       2774416 /s            1339611 /s            2560153 /s 128      128      1        223305 /s             112828 /s             2390234 /s 128      128      10       1419592 /s            404611 /s             2401086 /s 128      128      20       2365301 /s            793815 /s             2516045 /s 128      128      30       2647136 /s            915702 /s             2463175 /s 128      128      40       2721664 /s            1081728 /s            2400299 /s 128      128      50       2688304 /s            1149251 /s            2489667 /s 128      128      60       2774212 /s            1145298 /s            2453444 /s 128      128      70       2782905 /s            1165408 /s            2403510 /s 128      128      80       2818388 /s            1392486 /s            2389275 /s 128      128      90       2738468 /s            1546247 /s            2425994 /s 256      256      1        160146 /s             80530 /s          2369297 /s 256      256      10       1214041 /s            364460 /s             2142039 /s 256      256      20       1915432 /s            901668 /s             2156774 /s 256      256      30       2371862 /s            1124997 /s            2237464 /s 256      256      40       2630812 /s            1123016 /s            2216475 /s 256      256      50       2666827 /s            1239640 /s            2267322 /s 256      256      60       2635269 /s            1276851 /s            2318122 /s 256      256      70       2663477 /s            1333002 /s            2188256 /s 256      256      80       2672080 /s            1659850 /s            2315438 /s 256      256      90       2804828 /s            1497635 /s            2194905 /s 512      512      1        123294 /s             68426 /s          1892168 /s 512      512      10       1028250 /s            296454 /s             1728199 /s 512      512      20       1545215 /s            604512 /s             1963526 /s 512      512      30       1968728 /s            762240 /s             2000386 /s 512      512      40       2273678 /s            854483 /s             1948188 /s 512      512      50       2295335 /s            939350 /s             1858429 /s 512      512      60       2419257 /s            1056918 /s            1884224 /s 512      512      70       2346088 /s            980795 /s             1852387 /s 512      512      80       2341964 /s            928496 /s             1867498 /s 512      512      90       2375789 /s            1290064 /s            1923461 /s

转载请注明原文地址: https://www.6miu.com/read-28644.html

最新回复(0)