improvements for BufferStorage

This commit is contained in:
Yuri Orlov 2014-03-06 00:46:17 +03:00
parent 8ecb9e97c9
commit a2089edbf8

View file

@ -9,15 +9,19 @@
package org.telegram.messenger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
public class BuffersStorage {
public static BuffersStorage Instance = new BuffersStorage();
private final ArrayList<ByteBufferDesc> freeBuffers128;
private final ArrayList<ByteBufferDesc> freeBuffers1024;
private final ArrayList<ByteBufferDesc> freeBuffers4096;
private final ArrayList<ByteBufferDesc> freeBuffers16384;
private final ArrayList<ByteBufferDesc> freeBuffers32768;
private List<ByteBufferDesc> freeBuffers128;
private List<ByteBufferDesc> freeBuffers1024;
private List<ByteBufferDesc> freeBuffers4096;
private List<ByteBufferDesc> freeBuffers16384;
private List<ByteBufferDesc> freeBuffers32768;
private ReentrantLock lock = new ReentrantLock();
public BuffersStorage() {
freeBuffers128 = new ArrayList<ByteBufferDesc>();
@ -26,85 +30,34 @@ public class BuffersStorage {
freeBuffers16384 = new ArrayList<ByteBufferDesc>();
freeBuffers32768 = new ArrayList<ByteBufferDesc>();
for (int a = 0; a < 5; a++) {
for (int i = 0; i < 5; i++) {
freeBuffers128.add(new ByteBufferDesc(128));
}
for (int a = 0; a < 5; a++) {
freeBuffers1024.add(new ByteBufferDesc(1024 + 200));
}
for (int a = 0; a < 2; a++) {
for (int i = 0; i < 2; i++) {
freeBuffers4096.add(new ByteBufferDesc(4096 + 200));
}
for (int a = 0; a < 2; a++) {
freeBuffers16384.add(new ByteBufferDesc(16384 + 200));
}
for (int a = 0; a < 2; a++) {
freeBuffers32768.add(new ByteBufferDesc(40000));
}
}
public ByteBufferDesc getFreeBuffer(int size) {
ByteBufferDesc buffer = null;
if (size <= 128) {
synchronized (freeBuffers128) {
if (freeBuffers128.size() > 0) {
buffer = freeBuffers128.get(0);
freeBuffers128.remove(0);
}
}
if (buffer == null) {
buffer = new ByteBufferDesc(128);
FileLog.e("tmessages", "create new 128 buffer");
}
return getFreeBuffer(freeBuffers128, 128);
} else if (size <= 1024 + 200) {
synchronized (freeBuffers1024) {
if (freeBuffers1024.size() > 0) {
buffer = freeBuffers1024.get(0);
freeBuffers1024.remove(0);
}
}
if (buffer == null) {
buffer = new ByteBufferDesc(1024 + 200);
FileLog.e("tmessages", "create new 1024 buffer");
}
return getFreeBuffer(freeBuffers1024, 1024, 200);
} else if (size <= 4096 + 200) {
synchronized (freeBuffers4096) {
if (freeBuffers4096.size() > 0) {
buffer = freeBuffers4096.get(0);
freeBuffers4096.remove(0);
}
}
if (buffer == null) {
buffer = new ByteBufferDesc(4096 + 200);
FileLog.e("tmessages", "create new 4096 buffer");
}
return getFreeBuffer(freeBuffers4096, 4096, 200);
} else if (size <= 16384 + 200) {
synchronized (freeBuffers16384) {
if (freeBuffers16384.size() > 0) {
buffer = freeBuffers16384.get(0);
freeBuffers16384.remove(0);
}
}
if (buffer == null) {
buffer = new ByteBufferDesc(16384 + 200);
FileLog.e("tmessages", "create new 16384 buffer");
}
return getFreeBuffer(freeBuffers16384, 16384, 200);
} else if (size <= 40000) {
synchronized (freeBuffers32768) {
if (freeBuffers32768.size() > 0) {
buffer = freeBuffers32768.get(0);
freeBuffers32768.remove(0);
}
}
if (buffer == null) {
buffer = new ByteBufferDesc(40000);
FileLog.e("tmessages", "create new 40000 buffer");
}
return getFreeBuffer(freeBuffers32768, 40000);
} else {
buffer = new ByteBufferDesc(size);
ByteBufferDesc buffer = new ByteBufferDesc(size);
buffer.buffer.limit(size).rewind();
return buffer;
}
buffer.buffer.limit(size).rewind();
return buffer;
}
public void reuseFreeBuffer(ByteBufferDesc buffer) {
@ -112,25 +65,46 @@ public class BuffersStorage {
return;
}
if (buffer.buffer.capacity() == 128) {
synchronized (freeBuffers128) {
freeBuffers128.add(buffer);
}
reuseFreeBuffer(freeBuffers128, buffer);
} else if (buffer.buffer.capacity() == 1024 + 200) {
synchronized (freeBuffers1024) {
freeBuffers1024.add(buffer);
}
reuseFreeBuffer(freeBuffers1024, buffer);
} else if (buffer.buffer.capacity() == 4096 + 200) {
synchronized (freeBuffers4096) {
freeBuffers4096.add(buffer);
}
reuseFreeBuffer(freeBuffers4096, buffer);
} else if (buffer.buffer.capacity() == 16384 + 200) {
synchronized (freeBuffers16384) {
freeBuffers16384.add(buffer);
}
reuseFreeBuffer(freeBuffers16384, buffer);
} else if (buffer.buffer.capacity() == 40000) {
synchronized (freeBuffers32768) {
freeBuffers32768.add(buffer);
reuseFreeBuffer(freeBuffers32768, buffer);
}
}
private ByteBufferDesc getFreeBuffer(List<ByteBufferDesc> freeBuffersOfSize, int size) {
return getFreeBuffer(freeBuffersOfSize, size, 0);
}
private ByteBufferDesc getFreeBuffer(List<ByteBufferDesc> freeBuffersOfSize, int size, int overhead) {
lock.lock();
try {
ByteBufferDesc buffer;
if (freeBuffersOfSize.size() > 0) {
buffer = freeBuffersOfSize.get(0);
freeBuffersOfSize.remove(0);
} else {
buffer = new ByteBufferDesc(size + overhead);
FileLog.e("tmessages", "create new " + size + "buffer");
}
buffer.buffer.limit(size).rewind();
return buffer;
} finally {
lock.unlock();
}
}
private void reuseFreeBuffer(List<ByteBufferDesc> freeBuffersOfSize, ByteBufferDesc buffer) {
lock.lock();
try {
freeBuffersOfSize.add(buffer);
} finally {
lock.unlock();
}
}
}