免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

Netty對底層Selector如何優(yōu)化

這篇文章主要為大家展示了“Netty對底層Selector如何優(yōu)化”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Netty對底層Selector如何優(yōu)化”這篇文章吧。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)雨城免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

在創(chuàng)建NioEventLoop時會封裝一個JDK底層的Selector屬性

private Selector selector;

那么我們簡單看一下這個Selector在JDK層面的實現(xiàn)

public abstract class SelectorImpl extends AbstractSelector {    protected Set<SelectionKey> selectedKeys = new HashSet();    protected HashSet<SelectionKey> keys = new HashSet();    private Set<SelectionKey> publicKeys;    private Set<SelectionKey> publicSelectedKeys;

   protected SelectorImpl(SelectorProvider var1) {        super(var1);        if (Util.atBugLevel("1.4")) {            this.publicKeys = this.keys;            this.publicSelectedKeys = this.selectedKeys;        } else {            this.publicKeys = Collections.unmodifiableSet(this.keys);            this.publicSelectedKeys = Util.ungrowableSet(this.selectedKeys);        }    }}

從源碼中我們可以發(fā)現(xiàn), 當(dāng)服務(wù)器監(jiān)聽到事件后會封裝成SelectionKey放到HashSet中, 然后程序就可以從這個HashSet中取出事件進行處理.

而HashSet的add方法的時間復(fù)雜度是O(n), 為此Netty通過反射機制, 將底層的這個HashSet用數(shù)組替換了, 畢竟向數(shù)組中添加數(shù)據(jù)的時間復(fù)雜度是O(1), 那么我們從代碼中找到答案吧.

NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,                 SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) {            selector = openSelector();}

跟進openSelector()方法

private SelectorTuple openSelector() {  final SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet();}

它創(chuàng)建了一個SelectedSelectionKeySet對象, 我們再看下這個類

final class SelectedSelectionKeySet extends AbstractSet<SelectionKey> {

   SelectionKey[] keys;    int size;

   SelectedSelectionKeySet() {        keys = new SelectionKey[1024];    }

   @Override    public boolean add(SelectionKey o) {        if (o == null) {            return false;        }

       keys[size++] = o;        if (size == keys.length) {            increaseCapacity();        }

       return true;    }}

從這里我們可以發(fā)現(xiàn), 這個Set集合底層使用的是數(shù)組, 調(diào)用add方法時直接向數(shù)組中添加元素就可以, 時間復(fù)雜度O(1).

接下來看下Netty使用反射替換掉那個HashSet

Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys");Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys");          
selectedKeysField.set(unwrappedSelector, selectedKeySet);publicSelectedKeysField.set(unwrappedSelector, selectedKeySet);

Netty就是通過反射用這個SelectedSelectionKeySet類替換掉了Selector類中的HashSet. 

這個地方之所以被Netty搞成這樣, 其實還是為了性能. 因為這個地方是涉及數(shù)據(jù)讀寫的源頭, 如果這個地方的性能不高, 會嚴(yán)重影響到程序的性能. 這也歸根結(jié)底回到了數(shù)據(jù)結(jié)構(gòu)的知識.

以上是“Netty對底層Selector如何優(yōu)化”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁名稱:Netty對底層Selector如何優(yōu)化
文章URL:http://m.newbst.com/article18/gsoedp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、App開發(fā)商城網(wǎng)站、建站公司App設(shè)計、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)