From ffd66c3f528623fbd03430b62caf733e64346757 Mon Sep 17 00:00:00 2001 From: leventov Date: Sat, 25 Oct 2014 01:58:05 +0400 Subject: [PATCH] Improved estimateSegments() heuristic and fix tests --- .../openhft/chronicle/map/ChronicleMapBuilder.java | 14 ++++++++------ .../chronicle/map/ReplicatedChronicleMapTest.java | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index 11f29490d..0b2bfe620 100644 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -422,14 +422,16 @@ public class ChronicleMapBuilder implements Cloneable, return Math.max(estimateSegments(), minSegments); } - /** - * Heuristic -- number of segments ~= cube root from number of entries seems optimal - */ private int estimateSegments() { + for (int power = 0; power < 7; power++) { + if (entries < (1L << (7 + (2 * power)))) + return 1 << power; + } + // Heuristic -- number of segments ~= cube root from number of entries seems optimal int maxSegments = 65536; - for (int i = 4; i < maxSegments; i <<= 1) { - if (((long) i) * i * i >= entries) - return i; + for (int segments = 4; segments < maxSegments; segments <<= 1) { + if (((long) segments) * segments * segments >= entries) + return segments; } return maxSegments; } diff --git a/src/test/java/net/openhft/chronicle/map/ReplicatedChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/ReplicatedChronicleMapTest.java index a7d5d7d50..f67549868 100644 --- a/src/test/java/net/openhft/chronicle/map/ReplicatedChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/ReplicatedChronicleMapTest.java @@ -96,7 +96,7 @@ public class ReplicatedChronicleMapTest extends JSR166TestCase { * Returns a new map from Integers 1-5 to Strings "A"-"E". */ private ChronicleMap map5() throws IOException { - ChronicleMap map = newShmIntString(5); + ChronicleMap map = newShmIntString(10); assertTrue(map.isEmpty()); map.put(JSR166TestCase.one, "A"); map.put(JSR166TestCase.two, "B");