From 9a6af6a6fb17a3877344e2ce6b4f825fd9034e71 Mon Sep 17 00:00:00 2001 From: Peter Lawrey Date: Sat, 1 Nov 2014 09:26:38 +0000 Subject: [PATCH] Select OF_4_BYTES for Byteable values. (possibly OF_8_BYTES in the future) --- .../chronicle/map/AbstractChronicleMapBuilder.java | 9 +++++++-- .../net/openhft/chronicle/map/ChronicleMapBuilder.java | 6 +++++- .../map/OffHeapUpdatableChronicleMapBuilder.java | 4 ++-- .../net/openhft/chronicle/map/VanillaChronicleMap.java | 7 +++++++ .../chronicle/map/VanillaShortShortMultiMap.java | 2 +- .../net/openhft/chronicle/map/ChronicleMapTest.java | 10 +++++----- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/AbstractChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/AbstractChronicleMapBuilder.java index 774b17ae6..08a44d6ea 100644 --- a/src/main/java/net/openhft/chronicle/map/AbstractChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/AbstractChronicleMapBuilder.java @@ -119,7 +119,7 @@ public abstract class AbstractChronicleMapBuilder keyClass, Class valueClass) { + AbstractChronicleMapBuilder(Class keyClass, Class valueClass, Alignment alignment) { keyBuilder = new SerializationBuilder(keyClass, SerializationBuilder.Role.KEY); valueBuilder = new SerializationBuilder(valueClass, SerializationBuilder.Role.VALUE); + this.alignment = alignment; + } + + protected static boolean offHeapReference(Class valueClass) { + return Byteable.class.isAssignableFrom(valueClass); } diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index be8172522..ed3773038 100644 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -73,7 +73,11 @@ public final class ChronicleMapBuilder } ChronicleMapBuilder(Class keyClass, Class valueClass) { - super(keyClass, valueClass); + super(keyClass, valueClass, getAlignmentFor(valueClass)); + } + + private static Alignment getAlignmentFor(Class valueClass) { + return offHeapReference(valueClass) ? Alignment.OF_4_BYTES : Alignment.NO_ALIGNMENT; } @Override diff --git a/src/main/java/net/openhft/chronicle/map/OffHeapUpdatableChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/OffHeapUpdatableChronicleMapBuilder.java index 4a8aba2df..5545f86fe 100644 --- a/src/main/java/net/openhft/chronicle/map/OffHeapUpdatableChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/OffHeapUpdatableChronicleMapBuilder.java @@ -25,7 +25,7 @@ public final class OffHeapUpdatableChronicleMapBuilder public static OffHeapUpdatableChronicleMapBuilder of( @NotNull Class keyClass, @NotNull Class valueClass) { - if (!Byteable.class.isAssignableFrom(valueClass)) { + if (!offHeapReference(valueClass)) { if (!valueClass.isInterface()) { throw new IllegalArgumentException( "Value class should be either Byteable subclass or interface," + @@ -37,7 +37,7 @@ public final class OffHeapUpdatableChronicleMapBuilder } OffHeapUpdatableChronicleMapBuilder(Class keyClass, Class valueClass) { - super(keyClass, valueClass); + super(keyClass, valueClass, Alignment.OF_4_BYTES); prepareValueBytesOnAcquire(new ZeroOutValueBytes(valueSize())); } diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java index 7b8af09dd..3abecdc90 100644 --- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java @@ -764,6 +764,13 @@ class VanillaChronicleMap, V acquire(ThreadLocalCopies copies, MKI metaKeyInterop, KI keyInterop, K key, V usingValue, long hash2, boolean create) { + V v = acquire0(copies, metaKeyInterop, keyInterop, key, usingValue, hash2, false); + if (create && v == null) + v = acquire0(copies, metaKeyInterop, keyInterop, key, usingValue, hash2, true); + return v; + } + V acquire0(ThreadLocalCopies copies, MKI metaKeyInterop, KI keyInterop, K key, V usingValue, + long hash2, boolean create) { if (create) writeLock(); else diff --git a/src/main/java/net/openhft/chronicle/map/VanillaShortShortMultiMap.java b/src/main/java/net/openhft/chronicle/map/VanillaShortShortMultiMap.java index e860c33ea..2b97a209d 100644 --- a/src/main/java/net/openhft/chronicle/map/VanillaShortShortMultiMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaShortShortMultiMap.java @@ -62,7 +62,7 @@ class VanillaShortShortMultiMap implements MultiMap { public VanillaShortShortMultiMap(Bytes multiMapBytes, Bytes multiMapBitSetBytes) { long capacity = multiMapBytes.capacity() / ENTRY_SIZE; assert isPowerOf2(capacity); - assert (capacity / 2L) < MAX_CAPACITY; + assert (capacity / 2L) <= MAX_CAPACITY; this.capacity = (int) capacity; capacityMask = capacity - 1L; capacityMask2 = (capacity - 1L) * ENTRY_SIZE; diff --git a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java index 556f87d67..397d057df 100644 --- a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java @@ -577,14 +577,14 @@ public class ChronicleMapTest { // int runs = Integer.getInteger("runs", 10); for (int runs : new int[]{10, 50, 250, 500, 1000, 2500}) { final long entries = runs * 1000 * 1000L; - OffHeapUpdatableChronicleMapBuilder builder = OffHeapUpdatableChronicleMapBuilder - .of(CharSequence.class, IntValue.class) + OffHeapUpdatableChronicleMapBuilder builder = OffHeapUpdatableChronicleMapBuilder + .of(CharSequence.class, LongValue.class) .entries(entries) - .entrySize(20); + .entrySize(24); File tmpFile = File.createTempFile("testAcquirePerf", ".deleteme"); tmpFile.deleteOnExit(); - final ChronicleMap map = builder.createWithFile(tmpFile); + final ChronicleMap map = builder.createWithFile(tmpFile); int procs = Runtime.getRuntime().availableProcessors(); int threads = procs * 2; // runs > 100 ? procs / 2 : procs; @@ -600,7 +600,7 @@ public class ChronicleMapTest { futures.add(es.submit(new Runnable() { @Override public void run() { - IntValue value = nativeIntValue(); + LongValue value = nativeLongValue(); StringBuilder sb = new StringBuilder(); long next = 50 * 1000 * 1000; // use a factor to give up to 10 digit numbers.