diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-30 10:04:25 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-08-30 10:04:25 +0200 |
commit | da4433cd241557e7b6f13d7109f07f01d28518d7 (patch) | |
tree | 71583bcff873b965147daefaf103759c68839d70 /container-search/src | |
parent | c1a93692a89586ea6ed51e682cf18f9eafe7d89b (diff) |
Presize the hashmaps where possible to reduce resizing.
Diffstat (limited to 'container-search/src')
3 files changed, 21 insertions, 3 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java index 06b50145fc1..56354352203 100644 --- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java +++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/FastHit.java @@ -271,12 +271,14 @@ public class FastHit extends Hit { public void addSummary(Docsum docsum) { LazyDocsumValue lazyDocsumValue = new LazyDocsumValue(docsum); + reserve(docsum.getDefinition().getFieldCount()); for (DocsumField field : docsum.getDefinition().getFields()) { setDocsumFieldIfNotPresent(field.getName(), lazyDocsumValue); } } void addSummary(DocsumDefinition docsumDef, Inspector value) { + reserve(docsumDef.getFieldCount()); for (DocsumField field : docsumDef.getFields()) { String fieldName = field.getName(); if (value.type() == Type.STRING && diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java index b03c0cb752f..f0ca743f2eb 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java @@ -218,11 +218,16 @@ public class Dispatcher extends AbstractComponent { } private void fill(List<FastHit> hits, byte[] slimeBytes) { - Inspector summaries = new SlimeAdapter(BinaryFormat.decode(slimeBytes).get().field("docsums")); + Slime slime = BinaryFormat.decode(slimeBytes); + int maxFieldsInhit = slime.symbols(); + Inspector summaries = new SlimeAdapter(slime.get().field("docsums")); + summaries.fieldCount(); if ( ! summaries.valid()) throw new IllegalArgumentException("Expected a Slime root object containing a 'docsums' field"); for (int i = 0; i < hits.size(); i++) { - fill(hits.get(i), summaries.entry(i).field("docsum")); + FastHit hit = hits.get(i); + hit.reserve(maxFieldsInhit); + fill(hit, summaries.entry(i).field("docsum")); } } diff --git a/container-search/src/main/java/com/yahoo/search/result/Hit.java b/container-search/src/main/java/com/yahoo/search/result/Hit.java index 815006edbf5..248c84f143f 100644 --- a/container-search/src/main/java/com/yahoo/search/result/Hit.java +++ b/container-search/src/main/java/com/yahoo/search/result/Hit.java @@ -101,8 +101,11 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi public static final String SDDOCNAME_FIELD = "sddocname"; private Map<String,Object> getFieldMap() { + return getFieldMap(16); + } + private Map<String,Object> getFieldMap(int minSize) { if (fields == null) { - fields = new LinkedHashMap<>(16); + fields = new LinkedHashMap<>(minSize); } return fields; } @@ -448,6 +451,14 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable<Hi public final Map<String,Object> fields() { return getUnmodifiableFieldMap(); } /** + * Will preallocate in order to avoid resizing. + * @param minSize + */ + public void reserve(int minSize) { + getFieldMap(minSize); + } + + /** * Fields * @return An iterator for traversing the fields * @since 5.1.3 |