From 9449efb9b2a2c6a2a9a2f7263c2e5ba0437e2475 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Mon, 10 Jun 2013 16:38:24 +0900 Subject: [PATCH] Optimize Recycler.Stack - No need to use a deque at all - Increase the initial capacity so that there's no practical chance of capacity expansion --- .../src/main/java/io/netty/util/Recycler.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/io/netty/util/Recycler.java b/common/src/main/java/io/netty/util/Recycler.java index 4d14285137..c162da0186 100644 --- a/common/src/main/java/io/netty/util/Recycler.java +++ b/common/src/main/java/io/netty/util/Recycler.java @@ -16,8 +16,6 @@ package io.netty.util; -import java.util.ArrayDeque; -import java.util.Deque; import java.util.IdentityHashMap; import java.util.Map; @@ -64,19 +62,32 @@ public abstract class Recycler { public interface Handle { } static final class Stack implements Handle { + + private static final int INITIAL_CAPACITY = 256; + final Recycler parent; final Thread thread; - private final Deque deque = new ArrayDeque(); - private final Map map = new IdentityHashMap(); + private T[] elements; + private int size; + private final Map map = new IdentityHashMap(INITIAL_CAPACITY); + @SuppressWarnings({ "unchecked", "SuspiciousArrayCast" }) Stack(Recycler parent, Thread thread) { this.parent = parent; this.thread = thread; + elements = newArray(INITIAL_CAPACITY); } T pop() { - T ret = deque.pollLast(); + int size = this.size; + if (size == 0) { + return null; + } + size --; + T ret = elements[size]; + elements[size] = null; map.remove(ret); + this.size = size; return ret; } @@ -84,7 +95,21 @@ public abstract class Recycler { if (map.put(o, Boolean.TRUE) != null) { throw new IllegalStateException("recycled already"); } - deque.addLast(o); + + int size = this.size; + if (size == elements.length) { + T[] newElements = newArray(size << 1); + System.arraycopy(elements, 0, newElements, 0, size); + elements = newElements; + } + + elements[size] = o; + this.size = size + 1; + } + + @SuppressWarnings({ "unchecked", "SuspiciousArrayCast" }) + private static T[] newArray(int length) { + return (T[]) new Object[length]; } } }