ArrayBlockingQueue 和 LinkedBlockingQueue 效能測試與分析
ArrayBlockingQueue 和 LinkedBlockingQueue 效能測試
測試程式碼:
package com.demo.queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class ArrayBlockingQueueVsLinkedBlockingQueue {
//任務數量
public static int TASK_SUM = 0;
//生產者/消費者執行緒數
public static int THREAD_NUM = 0;
//佇列大小
public static int QUE_SIZE = 0;
/**
*測試方法
*/
public void test(final BlockingQueue<String> q) throws InterruptedException {
//生產者執行緒
class Producer implements Runnable {
@Override
public void run() {
for (int i = 0; i < TASK_SUM; i++) {
try {
q.put("task");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
;
//消費者執行緒
class Consumer implements Runnable {
@Override
public void run() {
for (int i = 0; i < TASK_SUM; i++) {
try {
q.take();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
;
//建立生產者
Thread[] arrProducerThread = new Thread[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++) {
arrProducerThread[i] = new Thread(new Producer());
}
//建立消費者
Thread[] arrConsumerThread = new Thread[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++) {
arrConsumerThread[i] = new Thread(new Consumer());
}
//go!
long t1 = System.currentTimeMillis();
for (int i = 0; i < THREAD_NUM; i++) {
arrProducerThread[i].start();
arrConsumerThread[i].start();
}
for (int i = 0; i < THREAD_NUM; i++) {
arrProducerThread[i].join();
arrConsumerThread[i].join();
}
long t2 = System.currentTimeMillis();
System.out.println("任務數量="+ArrayBlockingQueueVsLinkedBlockingQueue.TASK_SUM);
System.out.println("生產者和消費者各執行緒數量="+ArrayBlockingQueueVsLinkedBlockingQueue.THREAD_NUM);
System.out.println("佇列大小="+ArrayBlockingQueueVsLinkedBlockingQueue.QUE_SIZE);
System.out.println(q.getClass().getSimpleName() + " 耗時 : " + (t2 - t1)+"ms");
System.out.println();
}
/**
*主方法
*/
public static void main(String[] args) throws InterruptedException {
//任務數量
ArrayBlockingQueueVsLinkedBlockingQueue.TASK_SUM = 1000000;
//生產者和消費者各多少執行緒
ArrayBlockingQueueVsLinkedBlockingQueue.THREAD_NUM = 1;
//佇列大小
ArrayBlockingQueueVsLinkedBlockingQueue.QUE_SIZE = 100;
final BlockingQueue<String> q1 = new LinkedBlockingQueue<String>(ArrayBlockingQueueVsLinkedBlockingQueue.QUE_SIZE );
final BlockingQueue<String> q2 = new ArrayBlockingQueue<String>(ArrayBlockingQueueVsLinkedBlockingQueue.QUE_SIZE );
new ArrayBlockingQueueVsLinkedBlockingQueue().test(q1);
new ArrayBlockingQueueVsLinkedBlockingQueue().test(q2);
}
}
測試結果1:
任務數量=1000000
生產者和消費者各執行緒數量=1
佇列大小=100
LinkedBlockingQueue 耗時 : 569ms
任務數量=1000000
生產者和消費者各執行緒數量=1
佇列大小=100
ArrayBlockingQueue 耗時 : 560ms
測試結果2:
任務數量=1000000
生產者和消費者各執行緒數量=1
佇列大小=1000
LinkedBlockingQueue 耗時 : 454ms
任務數量=1000000
生產者和消費者各執行緒數量=1
佇列大小=1000
ArrayBlockingQueue 耗時 : 418ms
測試結果3:
任務數量=1000000
生產者和消費者各執行緒數量=10
佇列大小=100
LinkedBlockingQueue 耗時 : 4253ms
任務數量=1000000
生產者和消費者各執行緒數量=10
佇列大小=100
ArrayBlockingQueue 耗時 : 10053ms
測試結果4:
任務數量=1000000
生產者和消費者各執行緒數量=10
佇列大小=1000
LinkedBlockingQueue 耗時 : 3655ms
任務數量=1000000
生產者和消費者各執行緒數量=10
佇列大小=1000
ArrayBlockingQueue 耗時 : 3508ms
測試結果5:
任務數量=1000000
生產者和消費者各執行緒數量=30
佇列大小=1000
LinkedBlockingQueue 耗時 : 10417ms
任務數量=1000000
生產者和消費者各執行緒數量=30
佇列大小=1000
ArrayBlockingQueue 耗時 : 9432ms
測試結果6:
任務數量=1000000
生產者和消費者各執行緒數量=30
佇列大小=5000
LinkedBlockingQueue 耗時 : 10449ms
任務數量=1000000
生產者和消費者各執行緒數量=30
佇列大小=5000
ArrayBlockingQueue 耗時 : 5600ms
測試結果7:
任務數量=1000000
生產者和消費者各執行緒數量=100
佇列大小=5000
LinkedBlockingQueue 耗時 : 33265ms
任務數量=1000000
生產者和消費者各執行緒數量=100
佇列大小=5000
ArrayBlockingQueue 耗時 : 21303ms
總結:
- 總的來看,ArrayBlockingQueue 要比LinkedBlockingQueue 效率高;網上說LinkedBlockingQueue 效能更好,但我沒測出來;
- 兩者共同點,隨著執行緒增多,併發越大,效率越低;
- 兩者共同點,佇列容量越大,效率越高;
- 兩者共同點,單執行緒讀寫效率最高;
原因分析:
-
共同點好理解,執行緒多,併發大,互相爭搶,協調資源需要時間,所以降低了效率。增加佇列容量,相當於增大了緩衝,有益於提高效能;
-
但為什麼ArrayBlockingQueue 效能更好,我沒分析出來,有請大佬評論;
相關文章
- Java LinkedBlockingQueue和ArrayBlockingQueue分析JavaBloC
- 阻塞佇列 BlockingQueue(二)--ArrayBlockingQueue與LinkedBlockingQueue佇列BloC
- 效能測試之測試分析與調優
- 併發學習計劃-ArrayBlockingQueue和LinkedBlockingQueue02BloC
- 併發容器之ArrayBlockingQueue和LinkedBlockingQueue實現原理詳解BloC
- 效能狗(Perfdog)測試與資料分析
- 【效能調優】效能測試、分析與調優基礎
- 效能測試知多少---效能分析與調優的原理
- WebGPU效能測試分析WebGPU
- Kafka效能測試分析Kafka
- PR效能測試工具升級到全鏈路效能測試與分析平臺
- 淺談效能測試分析
- 對node工程進行壓力測試與效能分析
- 【效能測試】常見的效能問題分析思路(一)道與術
- gRPC PHP與GO 資料增長效能測試與分析RPCPHPGo
- 效能測試連載-需求分析
- 用Java如何設計一個阻塞佇列,然後說說ArrayBlockingQueue和LinkedBlockingQueueJava佇列BloC
- 介面測試和效能測試的區別
- 小白測試系列:介面測試與效能測試的區別
- Web效能測試種類與全面測試模型Web模型
- 效能測試瓶頸之CPU問題分析與調優
- ( 轉)效能測試--地鐵模型分析模型
- 軟體測試LR效能分析流程
- 軟體效能測試和可靠性測試
- 大話效能測試系列(1)- 效能測試概念與主要指標指標
- 效能測試學習(1)-效能測試分類與常見術語
- 《軟體效能測試、分析與調優實踐之路》簡介
- LoadRunner效能測試工具---(三)測試結果樣例分析
- 《軟體效能測試分析與調優實踐之路》(第2版) 讀書筆記(一)總體介紹(上)-真正從效能分析與調優來看效能測試筆記
- 《軟體效能測試分析與調優實踐之路》(第2版) 讀書筆記(二)總體介紹(下)-真正從效能分析與調優來看效能測試筆記
- 壓測和效能分析方法論
- 【學習效能分析--第二版】如何做好效能測試分析診斷調優-暨《軟體效能測試、分析與調優實踐之路》(第2版)推薦
- 軟體效能測試分析與調優實踐之路-Java應用程式的效能分析與調優-手稿節選Java
- 【效能測試】使用ab做Http效能測試HTTP
- 測試計劃&效能測試分析報告模板(僅供參考)
- Rust效能分析之測試及火焰圖,附(lru,lfu,arc)測試Rust
- Webapi管理和效能測試工具WebBenchmarkWebAPI
- Nginx 和 Gunicorn 效能對比測試Nginx