This commit is contained in:
Rob Austin
2014-11-04 14:29:06 +00:00
parent cff7c5bea8
commit a0c89935f5
76 changed files with 1248 additions and 2153 deletions
@@ -529,6 +529,79 @@ public class ChronicleMapTest {
map.close();
}
@Test
@Ignore
public void testLeanEntrySizeInt() throws IOException {
File file = File.createTempFile("testLeanEntrySize-Int", ".deleteme");
file.deleteOnExit();
int entries = 1000000;
int entrySize = 8;
ChronicleMap<IntValue, IntValue> map = OffHeapUpdatableChronicleMapBuilder
.of(IntValue.class, IntValue.class)
.entrySize(entrySize)
.entries(entries)
.create();
IntValue key = DataValueClasses.newInstance(IntValue.class);
IntValue value = DataValueClasses.newDirectReference(IntValue.class);
for (int i = 0; i < entries; i++) {
key.setValue(i);
try (WriteContext wc = map.acquireUsingLocked(key, value)) {
value.setValue(i);
}
}
for (int i = 0; i < entries; i++) {
key.setValue(i);
try (ReadContext rc = map.getUsingLocked(key, value)) {
assertTrue(rc.present());
assertEquals(i, value.getValue());
}
}
map.close();
// check the extents of the map.
int hashSize = 8; // assume short-short hashing
int sizePerEntry = hashSize * 2 + entrySize * 5 / 4 /* + 25% */;
long fileSizeExpected = entries * sizePerEntry;
long length = file.length();
assertTrue(length > fileSizeExpected);
assertTrue(length < fileSizeExpected * 12 / 10);
}
@Test
@Ignore
public void testLeanEntrySizeLong() throws IOException {
File file = File.createTempFile("testLeanEntrySize-Long", ".deleteme");
file.deleteOnExit();
int entries = 1000000;
int entrySize = 16;
ChronicleMap<LongValue, LongValue> map = OffHeapUpdatableChronicleMapBuilder
.of(LongValue.class, LongValue.class)
.entrySize(entrySize)
.entries(entries)
.create();
LongValue key = DataValueClasses.newInstance(LongValue.class);
LongValue value = DataValueClasses.newDirectReference(LongValue.class);
for (long i = 0; i < entries; i++) {
key.setValue(i);
map.acquireUsing(key, value);
value.setValue(i);
}
for (long i = 0; i < entries; i++) {
key.setValue(i);
assertNotNull(map.getUsing(key, value));
assertEquals(i, value.getValue());
}
map.close();
// check the extents of the map.
int hashSize = 8; // assume short-short hashing
int sizePerEntry = hashSize * 2 + entrySize * 5 / 4 /* + 25% */;
long fileSizeExpected = entries * sizePerEntry;
long length = file.length();
assertTrue(length > fileSizeExpected);
assertTrue(length < fileSizeExpected * 12 / 10);
}
@Test
public void testAcquireFromMultipleThreads() throws Exception {
int entries = 1000 * 1000;
@@ -578,19 +651,19 @@ public class ChronicleMapTest {
int procs = Runtime.getRuntime().availableProcessors();
int threads = procs * 2; // runs > 100 ? procs / 2 : procs;
ExecutorService es = Executors.newFixedThreadPool(procs);
for (int runs : new int[]{10, 50, 250, 500, 1000, 2500}) {
for (int runs : new int[]{10, 25, 50, 250, 500, 1000, 2500}) {
// JAVA 8 produces more garbage than previous versions for internal work.
// System.gc();
final long entries = runs * 1000 * 1000L;
OffHeapUpdatableChronicleMapBuilder<CharSequence, LongValue> builder = OffHeapUpdatableChronicleMapBuilder
.of(CharSequence.class, LongValue.class)
OffHeapUpdatableChronicleMapBuilder<LongValue, LongValue> builder = OffHeapUpdatableChronicleMapBuilder
.of(LongValue.class, LongValue.class)
.entries(entries)
.entryAndValueAlignment(OF_8_BYTES)
.entrySize(24);
.entrySize(16);
File tmpFile = File.createTempFile("testAcquirePerf", ".deleteme");
tmpFile.deleteOnExit();
final ChronicleMap<CharSequence, LongValue> map = builder.createWithFile(tmpFile);
final ChronicleMap<LongValue, LongValue> map = builder.createPersistedTo(tmpFile);
int count = runs > 500 ? runs > 1200 ? 3 : 5 : 5;
final int independence = Math.min(procs, runs > 500 ? 8 : 4);
@@ -603,16 +676,14 @@ public class ChronicleMapTest {
futures.add(es.submit(new Runnable() {
@Override
public void run() {
LongValue key = DataValueClasses.newDirectInstance(LongValue.class);
LongValue value = nativeLongValue();
StringBuilder sb = new StringBuilder();
long next = 50 * 1000 * 1000;
// use a factor to give up to 10 digit numbers.
int factor = Math.max(1, (int) ((10 * 1000 * 1000 * 1000L - 1) / entries));
for (long j = t % independence; j < entries + independence - 1; j += independence) {
sb.setLength(0);
sb.append("us:");
sb.append(j * factor);
map.acquireUsing(sb, value);
key.setValue(j * factor);
map.acquireUsing(key, value);
long n = value.addAtomicValue(1);
assert n > 0 && n < 1000 : "Counter corrupted " + n;
if (t == 0 && j >= next) {
@@ -639,6 +710,7 @@ public class ChronicleMapTest {
es.shutdown();
es.awaitTermination(1, TimeUnit.MINUTES);
}
@Test
@Ignore
public void testAcquireLockedPerf()
@@ -660,7 +732,7 @@ public class ChronicleMapTest {
File tmpFile = File.createTempFile("testAcquirePerf", ".deleteme");
tmpFile.deleteOnExit();
final ChronicleMap<CharSequence, LongValue> map = builder.createWithFile(tmpFile);
final ChronicleMap<CharSequence, LongValue> map = builder.createPersistedTo(tmpFile);
int count = runs > 500 ? runs > 1200 ? 3 : 5 : 5;
final int independence = Math.min(procs, runs > 500 ? 8 : 4);
@@ -683,7 +755,7 @@ public class ChronicleMapTest {
sb.append("us:");
sb.append(j * factor);
long n;
try(WriteContext wc = map.acquireUsingLocked(sb, value)) {
try (WriteContext wc = map.acquireUsingLocked(sb, value)) {
n = value.addValue(1);
}
assert n > 0 && n < 1000 : "Counter corrupted " + n;
@@ -1229,10 +1301,9 @@ public class ChronicleMapTest {
.entries(10)
.minSegments(1)
.entrySize(10);
builder.file(getPersistenceFile());
testOversizeEntriesPutRemoveReplace(
(VanillaChronicleMap<CharSequence, ?, ?, CharSequence, ?, ?>)
builder.create()
builder.createPersistedTo(getPersistenceFile())
);
}
@@ -1334,7 +1405,7 @@ public class ChronicleMapTest {
.entrySize(16);
File tmpFile = File.createTempFile("testAcquireUsingLocked", ".deleteme");
tmpFile.deleteOnExit();
final ChronicleMap<CharSequence, LongValue> map = builder.createWithFile(tmpFile);
final ChronicleMap<CharSequence, LongValue> map = builder.createPersistedTo(tmpFile);
LongValue value = nativeLongValue();
@@ -1391,7 +1462,7 @@ public class ChronicleMapTest {
.entrySize(40);
File tmpFile = File.createTempFile("testAcquireUsingLocked", ".deleteme");
tmpFile.deleteOnExit();
final ChronicleMap<CharSequence, LongValue> map = builder.createWithFile(tmpFile);
final ChronicleMap<CharSequence, LongValue> map = builder.createPersistedTo(tmpFile);
LongValue value = DataValueClasses.newInstance(LongValue.class);