* SDSCache: Reduce min and increase max size

* SimpleByteCache: Change from LBQ to ABQ to reduce object churn
This commit is contained in:
zzz
2012-08-25 14:44:52 +00:00
parent 38fda46d44
commit 70820d7be6
2 changed files with 19 additions and 5 deletions

View File

@ -45,8 +45,8 @@ public class SDSCache<V extends SimpleDataStructure> {
//private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(SDSCache.class); //private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(SDSCache.class);
private static final Class[] conArg = new Class[] { byte[].class }; private static final Class[] conArg = new Class[] { byte[].class };
private static final double MIN_FACTOR = 0.25; private static final double MIN_FACTOR = 0.20;
private static final double MAX_FACTOR = 3.0; private static final double MAX_FACTOR = 5.0;
private static final double FACTOR; private static final double FACTOR;
static { static {
long maxMemory = Runtime.getRuntime().maxMemory(); long maxMemory = Runtime.getRuntime().maxMemory();

View File

@ -2,6 +2,7 @@ package net.i2p.util;
import java.util.Map; import java.util.Map;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -19,6 +20,9 @@ public final class SimpleByteCache {
private static final int DEFAULT_SIZE = 16; private static final int DEFAULT_SIZE = 16;
/** up to this, use ABQ to minimize object churn and for performance; above this, use LBQ for two locks */
private static final int MAX_FOR_ABQ = 64;
/** /**
* Get a cache responsible for arrays of the given size * Get a cache responsible for arrays of the given size
* *
@ -58,11 +62,11 @@ public final class SimpleByteCache {
/** list of available and available entries */ /** list of available and available entries */
private Queue<byte[]> _available; private Queue<byte[]> _available;
private int _maxCached; private int _maxCached;
private int _entrySize; private final int _entrySize;
private SimpleByteCache(int maxCachedEntries, int entrySize) { private SimpleByteCache(int maxCachedEntries, int entrySize) {
_available = new LinkedBlockingQueue(maxCachedEntries);
_maxCached = maxCachedEntries; _maxCached = maxCachedEntries;
_available = createQueue();
_entrySize = entrySize; _entrySize = entrySize;
} }
@ -70,13 +74,23 @@ public final class SimpleByteCache {
if (_maxCached >= maxCachedEntries) return; if (_maxCached >= maxCachedEntries) return;
_maxCached = maxCachedEntries; _maxCached = maxCachedEntries;
// make a bigger one, move the cached items over // make a bigger one, move the cached items over
Queue<byte[]> newLBQ = new LinkedBlockingQueue(maxCachedEntries); Queue<byte[]> newLBQ = createQueue();
byte[] ba; byte[] ba;
while ((ba = _available.poll()) != null) while ((ba = _available.poll()) != null)
newLBQ.offer(ba); newLBQ.offer(ba);
_available = newLBQ; _available = newLBQ;
} }
/**
* @return LBQ or ABQ
* @since 0.9.2
*/
private Queue<byte[]> createQueue() {
if (_maxCached <= MAX_FOR_ABQ)
return new ArrayBlockingQueue(_maxCached);
return new LinkedBlockingQueue(_maxCached);
}
/** /**
* Get the next available array, either from the cache or a brand new one * Get the next available array, either from the cache or a brand new one
*/ */