Use the cached iterator list to remove Iterator allocation hotspots

This commit is contained in:
zab
2012-11-23 07:22:58 +00:00
parent f238d0514f
commit 0ec77f5514
3 changed files with 25 additions and 3 deletions

View File

@ -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();
}

View File

@ -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());
}
}

View File

@ -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