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