From 0ec77f55147d8f6ac10977ed92bb205af0afb475 Mon Sep 17 00:00:00 2001 From: zab <zab@mail.i2p> Date: Fri, 23 Nov 2012 07:22:58 +0000 Subject: [PATCH] Use the cached iterator list to remove Iterator allocation hotspots --- core/java/src/net/i2p/data/RouterInfo.java | 4 ++-- .../i2p/util/CachedIteratorArrayListTest.java | 21 +++++++++++++++++++ .../i2p/router/transport/udp/PeerState.java | 3 ++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java index 9f980716f5..5f11f70176 100644 --- a/core/java/src/net/i2p/data/RouterInfo.java +++ b/core/java/src/net/i2p/data/RouterInfo.java @@ -15,7 +15,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.security.DigestInputStream; import java.security.MessageDigest; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -31,6 +30,7 @@ import net.i2p.crypto.DSAEngine; import net.i2p.crypto.SHA1; import net.i2p.crypto.SHA1Hash; import net.i2p.crypto.SHA256Generator; +import net.i2p.util.CachedIteratorArrayList; import net.i2p.util.Clock; import net.i2p.util.Log; import net.i2p.util.OrderedProperties; @@ -81,7 +81,7 @@ public class RouterInfo extends DatabaseEntry { public static final String BW_CAPABILITY_CHARS = "KLMNO"; public RouterInfo() { - _addresses = new ArrayList(2); + _addresses = new CachedIteratorArrayList<RouterAddress>(2); _options = new OrderedProperties(); } diff --git a/core/java/test/junit/net/i2p/util/CachedIteratorArrayListTest.java b/core/java/test/junit/net/i2p/util/CachedIteratorArrayListTest.java index 3d0fe85fd1..860f0e213c 100644 --- a/core/java/test/junit/net/i2p/util/CachedIteratorArrayListTest.java +++ b/core/java/test/junit/net/i2p/util/CachedIteratorArrayListTest.java @@ -2,6 +2,7 @@ package net.i2p.util; import static org.junit.Assert.*; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -68,4 +69,24 @@ public class CachedIteratorArrayListTest { assertEquals('c',iter.next().charValue()); assertFalse(iter.hasNext()); } + + /** + * tests the Collections.sort method because that is used + * in the router and internally creates iterators + */ + @Test + public void testSorting() { + List<Integer> li = new CachedIteratorArrayList<Integer>(); + li.add(3); + li.add(2); + li.add(1); + Collections.sort(li); + + Iterator<Integer> ii = li.iterator(); + assertEquals(1,ii.next().intValue()); + assertEquals(2,ii.next().intValue()); + assertEquals(3,ii.next().intValue()); + + assertFalse(ii.hasNext()); + } } diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java index a0b5d68711..31b2dd7bda 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -18,6 +18,7 @@ import net.i2p.router.OutNetMessage; import net.i2p.router.RouterContext; import net.i2p.router.util.CoDelPriorityBlockingQueue; import net.i2p.router.util.PriBlockingQueue; +import net.i2p.util.CachedIteratorArrayList; import net.i2p.util.Log; import net.i2p.util.ConcurrentHashSet; @@ -323,7 +324,7 @@ class PeerState { _rtt = INIT_RTT; _rttDeviation = _rtt; _inboundMessages = new HashMap(8); - _outboundMessages = new ArrayList(32); + _outboundMessages = new CachedIteratorArrayList<OutboundMessageState>(32); //_outboundQueue = new CoDelPriorityBlockingQueue(ctx, "UDP-PeerState", 32); _outboundQueue = new PriBlockingQueue(ctx, "UDP-PeerState", 32); // all createRateStat() moved to EstablishmentManager -- GitLab