Optimize VanillaChronicleMap.longSize(): don't acquire and close context for each segment, and make it atomic against concurrent map.close()

This commit is contained in:
leventov
2016-08-05 23:20:50 +07:00
parent c9bd74a29e
commit f9edc314bb
2 changed files with 12 additions and 11 deletions
@@ -715,17 +715,6 @@ public abstract class VanillaChronicleHash<K,
return (int) (sizeInBytes / chunkSize) + 1;
}
@Override
public final long longSize() {
long result = 0L;
for (int i = 0; i < segments(); i++) {
try (SC c = segmentContext(i)) {
result += c.size();
}
}
return result;
}
public final int size() {
long size = longSize();
return size > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) size;
@@ -169,6 +169,18 @@ public class VanillaChronicleMap<K, V, R>
return (V) value;
}
@Override
public final long longSize() {
long result = 0L;
try (IterationContext<K, V, ?> c = iterationContext()) {
for (int segmentIndex = 0; segmentIndex < segments(); segmentIndex++) {
c.initSegmentIndex(segmentIndex);
result += c.size();
}
}
return result;
}
@Override
public Class<K> keyClass() {
return keyClass;