用定制的set替换sun.nio.ch.SelectorImpl中的selectedKeys和publicSelectedKeys

172 阅读1分钟

sun.nio.ch.SelectorImpl中的selectedKeys和publicSelectedKeys本来的用的是hashset,用定制的Set去替换他们。

可以占用更少的内存,有(1~2%)的性能提升。

/*

  • Copyright 2013 The Netty Project
  • The Netty Project licenses this file to you under the Apache License,
  • version 2.0 (the "License"); you may not use this file except in compliance
  • with the License. You may obtain a copy of the License at:
  • www.apache.org/licenses/LI…
  • Unless required by applicable law or agreed to in writing, software
  • distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  • WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  • License for the specific language governing permissions and limitations
  • under the License. */ package io.netty.channel.nio;

import java.nio.channels.SelectionKey; import java.util.AbstractSet; import java.util.Arrays; import java.util.Iterator; import java.util.NoSuchElementException;

final class SelectedSelectionKeySet extends AbstractSet {

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;
}

@Override
public boolean remove(Object o) {
    return false;
}

@Override
public boolean contains(Object o) {
    return false;
}

@Override
public int size() {
    return size;
}

@Override
public Iterator<SelectionKey> iterator() {
    return new Iterator<SelectionKey>() {
        private int idx;

        @Override
        public boolean hasNext() {
            return idx < size;
        }

        @Override
        public SelectionKey next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            return keys[idx++];
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    };
}

void reset() {
    reset(0);
}

void reset(int start) {
    Arrays.fill(keys, start, size, null);
    size = 0;
}

private void increaseCapacity() {
    SelectionKey[] newKeys = new SelectionKey[keys.length << 1];
    System.arraycopy(keys, 0, newKeys, 0, size);
    keys = newKeys;
}

}