亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java 集合與隊列的插入、刪除在并發下的性能比較

2019-11-17 03:26:51
字體:
來源:轉載
供稿:網友

這兩天在寫一個java多線程的爬蟲,以廣度優先爬取網頁,設置兩個緩存:
•  一個保存已經訪問過的URL:vistedUrls
•  一個保存沒有訪問過的URL:unVistedUrls

  需要爬取的數據量不大,對URL壓縮后,可以把這兩個數據結構都放入內存,vistedUrls很顯然用HashSet<String>實現,因為已經訪問的URL只會添加,不會刪除和修改,使用HashSet可以高效判斷一個URL是否已經訪問。

  糾結unVistedUrls該用什么數據結構,如果用隊列的話,并發情況下,隊列中可能會用重復的URL,比如一個線程A爬了CSDN的一個URL1,另一個線程B爬了博客園的一個URL2,URL1和URL2的頁面都有一個相同的出鏈URL3,線程A把URL3加入到unVistedUrls的隊尾,等待下次爬取,但在URL3被爬取之前,線程B也把URL3加到隊尾,這樣隊列中就有兩個相同的URL,可能會導致重復爬取網頁,當然可以通過其他方法來保證不會重復爬取。

  然后就想能否也用Set來保存未訪問的URL,這樣在添加新的URL時,自動去重處理了,能夠有效保證不爬取重復網頁。但是unVistedUrls會有大量的插入和刪除操作,我認為對集合進行大量的插入刪除性能會比較低,為了測試集合的插入刪除性能對比隊列低多少,我寫了一個簡單的并發測試:


復制代碼
  1 /**
  2  * 測試集合與隊列的插入與讀寫性能
  3  *
  4  * @author jiqunpeng@Gmail.com
  5  *
  6  */
  7 public class SetQueueTest {
  8     // 隨即數構造器
  9     PRivate static Random r = new Random(10);
 10     // 控制測試線程停止的原子變量
 11     private static AtomicBoolean stop = new AtomicBoolean(false);
 12
 13     /***
 14      * 基類,供測試用
 15      *
 16      * @author jiqunpeng@gmail.com
 17      *
 18      */
 19     static abstract class Service {
 20         // 操作的計數器
 21         protected long count = 0;
 22
 23         // 添加一堆元素,并去一個元素
 24         public abstract String addAndPick(List<String> elements);
 25
 26         // 取一個元素
 27         public abstract String pickOne();
 28
 29         /**
 30          * 打印操作次數
 31          */
 32         public void tell() {
 33             System.out.println(this + " :/t" + count);
 34         }
 35     }
 36
 37     /***
 38      * 采用TreeSet的集合工具
 39      *
 40      * @author jiqunpeng@gmail.com
 41      *
 42      */
 43     static class SetService extends Service {
 44         private TreeSet<String> set = new TreeSet<String>();
 45
 46         @Override
 47         public synchronized String addAndPick(List<String> elements) {
 48             count++;
 49             set.addAll(elements);
 50             return set.pollFirst();
 51         }
 52
 53         @Override
 54         public synchronized String pickOne() {
 55             count++;
 56             return set.pollFirst();
 57         }
 58
 59     }
 60
 61     /***
 62      * 采用LinkedList的隊列工具
 63      *
 64      * @author jiqunpeng@gmail.com
 65      *
 66      */
 67     static class QueueService extends Service {
 68         private Queue<String> queue = new LinkedList<String>();
 69
 70         @Override
 71         public synchronized String addAndPick(List<String> elements) {
 72             count++;
 73             queue.addAll(elements);
 74             return queue.poll();
 75         }
 76
 77         @Override
 78         public synchronized String pickOne() {
 79             count++;
 80             return queue.poll();
 81         }
 82     }
 83
 84     /***
 85      * 測試類
 86      *
 87      * @author jiqunpeng@gmail.com
 88      *
 89      */
 90     static class Tester implements Runnable {
 91         // 綁定要測試的工具對象
 92         private Service service;
 93
 94         Tester(Service s) {
 95             this.service = s;
 96         }
 97
 98         @Override
 99         public void run() {
100             while (stop.get() == false) {
101                 List<String> elements = new ArrayList<String>();
102                 int len = r.nextInt(200) + 8;
103                 for (int i = 0; i < len; i++) {
104                     elements.add(String.valueOf(r.nextInt()));
105                 }
106                 service.addAndPick(elements);
107                 for (int i = 0; i < 104; i++)
108                     service.pickOne();
109             }
110         }
111     }
112
113     /***
114      * 多線程方式,測試一個插入、刪除工具
115      *
116      * @param service
117      * @param time
118      * @param unit
119      * @throws InterruptedException
120      */
121     private static void test(Service service, int time, TimeUnit unit)
122             throws InterruptedException {
123         ExecutorService execs = Executors.newCachedThreadPool();
124         for (int i = 0; i < 20; i++) {
125             execs.execute(new Tester(service));
126         }
127         execs.shutdown();
128         unit.sleep(time);
129         stop.compareAndSet(false, true);
130         service.tell();
131     }
132
133     public static void main(String[] args) throws InterruptedException {
134         Service setService = new SetService();
135         test(setService, 5, TimeUnit.SECONDS);
136         stop.compareAndSet(true, false);// 重置終止條件
137         Service queueService = new QueueService();
138         test(queueService, 5, TimeUnit.SECONDS);
139     }
140 }

復制代碼

  輸出的結果如下:

SetQueueTest$SetService@5e9de959 :      7149859
SetQueueTest$QueueService@11b343e0 :    24303408

 

  測試結果讓我感到吃驚,TreeSet的插入刪除效率確實比LinkedList低,20個線程跑了10秒,使用隊列,插入刪除24303408次,使用集合,插入刪除7149859次。它們之間差距并不大,隊列只比集合快2~3倍。屬于同一個數量級。于是我這個小型的爬蟲應該放心的選擇用Set作為unVistedUrls的實現。

    轉載請注明出處:www.49028c.com/fengfenggirl


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品aⅴ中文字幕乱码| 亚洲精品日产aⅴ| 中文字幕精品www乱入免费视频| 在线一区二区日韩| 538国产精品一区二区免费视频| 日韩在线免费观看视频| 欧美多人爱爱视频网站| 成人网在线免费观看| 欧美高清在线播放| 成人免费自拍视频| 欧美极品少妇全裸体| 欧美影院久久久| 日本aⅴ大伊香蕉精品视频| 精品国产欧美一区二区三区成人| 久久精品电影一区二区| 黑人狂躁日本妞一区二区三区| 亚洲国产精品va在看黑人| 美日韩精品免费视频| 久久久久久久一| 亚洲图片欧美日产| 欧美黄色成人网| 国产精品一区二区久久| 久久久久九九九九| 久久久久久成人| 亚洲精品美女久久久| 51午夜精品视频| 欧美亚洲视频一区二区| 国产精品视频大全| 夜夜狂射影院欧美极品| 亚洲电影免费在线观看| 亚洲精品第一国产综合精品| 亚洲免费成人av电影| 国产精品欧美激情在线播放| 97超碰色婷婷| 精品一区二区三区三区| 欧美黄网免费在线观看| 国产精品国产三级国产aⅴ9色| 欧洲午夜精品久久久| 这里只有精品丝袜| 日韩免费视频在线观看| 久久夜色撩人精品| 国产精品九九久久久久久久| 97视频免费看| 亚洲福利在线视频| 日韩在线视频免费观看高清中文| 欧美综合国产精品久久丁香| 色偷偷888欧美精品久久久| 亚洲精品美女在线| 欧美国产日韩在线| 国产午夜精品久久久| 2019国产精品自在线拍国产不卡| 色香阁99久久精品久久久| 国产日产亚洲精品| 日本中文字幕不卡免费| 亚洲国产成人91精品| 亚洲午夜色婷婷在线| 欧美性开放视频| 国产欧美精品一区二区| 欧美性猛交99久久久久99按摩| 欧美精品videos另类日本| 亚洲a级在线播放观看| 精品无人国产偷自产在线| 久久亚洲精品一区二区| 性色av一区二区三区| 亚洲精品电影在线| 久久综合88中文色鬼| 91超碰中文字幕久久精品| 亚洲男人天堂网站| 国产精品久久久久影院日本| 亚洲а∨天堂久久精品喷水| 亚洲直播在线一区| 中文字幕精品在线视频| 夜色77av精品影院| yw.139尤物在线精品视频| 成人国产精品一区二区| 国产小视频国产精品| 欧美肥老太性生活视频| 精品久久久久久久久久| 久久久成人的性感天堂| 成人欧美一区二区三区黑人| 国产精品第1页| 亚洲激情 国产| 日韩精品在线视频| 亚洲欧美激情视频| 正在播放亚洲1区| 91精品国产自产在线| 国产91网红主播在线观看| 亚洲香蕉伊综合在人在线视看| 亚洲视频在线观看网站| 国产精品扒开腿做爽爽爽视频| 亚洲激情在线观看视频免费| 777777777亚洲妇女| 亚洲一区二区三区四区视频| 久久福利视频导航| 精品久久久久久久大神国产| 亚洲天堂成人在线视频| 7777免费精品视频| 国产精品国产自产拍高清av水多| 亚洲自拍偷拍网址| 欧美日韩国产91| 亚洲精品视频免费| 91精品视频免费观看| 不卡av日日日| 久久的精品视频| 7777免费精品视频| 欧美电影院免费观看| 岛国精品视频在线播放| 国产精品777| 亚洲第一福利在线观看| 91在线色戒在线| 国内精品久久久久久久| 欧美黑人视频一区| 久久6免费高清热精品| 国产91精品黑色丝袜高跟鞋| 日韩成人激情视频| 在线精品国产欧美| 日韩网站免费观看高清| 欧美成人一区二区三区电影| 不卡av在线网站| 国产精品美女www爽爽爽视频| 久久精品视频在线播放| 亚洲一区中文字幕在线观看| 69视频在线免费观看| 美日韩丰满少妇在线观看| 成人网在线免费观看| 欧亚精品在线观看| 91免费在线视频网站| 亚洲欧美激情视频| 亚洲精品一区二区久| 日韩在线观看成人| 欧美性视频网站| 欧美日韩在线影院| 成人在线国产精品| 韩国v欧美v日本v亚洲| 久久综合亚洲社区| 51视频国产精品一区二区| 亚洲女人初尝黑人巨大| 日韩最新免费不卡| 国产精品27p| 午夜精品99久久免费| 91免费在线视频网站| 久久久国产精品视频| 国产精品一二三在线| 少妇精69xxtheporn| 丝袜美腿亚洲一区二区| 日韩精品极品在线观看播放免费视频| 日韩精品在线视频美女| 激情av一区二区| 日韩欧美视频一区二区三区| 国产精品无av码在线观看| 亚洲片在线资源| 欧美在线视频一二三| 国产精品视频白浆免费视频| 欧美综合在线第二页| 高清日韩电视剧大全免费播放在线观看| 日韩精品极品在线观看| 色播久久人人爽人人爽人人片视av| 欧美成人合集magnet| 国产一区玩具在线观看| 成人深夜直播免费观看| 色yeye香蕉凹凸一区二区av| 欧美日韩第一视频| 国产不卡视频在线| 亚洲精品女av网站|