From 5381ce1b3f336a09ecf8fe6e991d1fa2b12282d6 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Mon, 9 Sep 2019 15:38:24 +0200 Subject: Removing elements from an array is very costly. Make a new one and copy the ones to keep instead. --- container-search/src/main/java/com/yahoo/search/result/Hit.java | 1 - .../src/main/java/com/yahoo/search/result/HitGroup.java | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'container-search/src/main') 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 10fa7d24d1a..13f0dc1c007 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 @@ -625,7 +625,6 @@ public class Hit extends ListenableFreezableClass implements Data, Comparable, Cloneable, Iterable< currentIndex++; if (currentIndex < offset || currentIndex >= highBound) { - i.remove(); handleRemovedHit(hit); } } + if ((offset > 0) || (hits.size() > highBound)) { + ListenableArrayList newHits = new ListenableArrayList<>(numHits); + for (int index = offset; index < Math.min(highBound, hits.size()); index++) { + newHits.add(hits.get(index)); + } + hits = newHits; + unmodifiableHits = Collections.unmodifiableList(hits); + } } /** -- cgit v1.2.3 From dc06b30f6a1861b5c25ae0c2d50865d053ebdffa Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Mon, 9 Sep 2019 23:04:49 +0200 Subject: Propagate listeners --- .../src/main/java/com/yahoo/search/result/HitGroup.java | 14 +++++++------- .../java/com/yahoo/collections/ListenableArrayList.java | 7 ++++++- 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'container-search/src/main') diff --git a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java index a12a2566f68..056976724bb 100644 --- a/container-search/src/main/java/com/yahoo/search/result/HitGroup.java +++ b/container-search/src/main/java/com/yahoo/search/result/HitGroup.java @@ -500,15 +500,15 @@ public class HitGroup extends Hit implements DataList, Cloneable, Iterable< if (hit.isAuxiliary()) continue; currentIndex++; - if (currentIndex < offset || currentIndex >= highBound) { + if (currentIndex < offset || currentIndex >= highBound) handleRemovedHit(hit); - } } if ((offset > 0) || (hits.size() > highBound)) { ListenableArrayList newHits = new ListenableArrayList<>(numHits); - for (int index = offset; index < Math.min(highBound, hits.size()); index++) { + for (int index = offset; index < Math.min(highBound, hits.size()); index++) newHits.add(hits.get(index)); - } + for (Runnable listener : hits.listeners()) + newHits.addListener(listener); hits = newHits; unmodifiableHits = Collections.unmodifiableList(hits); } @@ -842,7 +842,7 @@ public class HitGroup extends Hit implements DataList, Cloneable, Iterable< Hit hitClone = i.next().clone(); hitGroupClone.hits.add(hitClone); } - if (this.errorHit!=null) { // Find the cloned error and assign it + if (this.errorHit != null) { // Find the cloned error and assign it for (Hit hit : hitGroupClone.asList()) { if (hit instanceof DefaultErrorHit) hitGroupClone.errorHit=(DefaultErrorHit)hit; @@ -874,7 +874,7 @@ public class HitGroup extends Hit implements DataList, Cloneable, Iterable< /* This is an optimisation to avoid creating many temporary hash sets in the happy path. The simple naive implementation is - Set filled = null; + Set filled = null; for (Hit hit : hits) { if (hit.getFilled() == null) continue; if (filled == null) @@ -883,7 +883,7 @@ public class HitGroup extends Hit implements DataList, Cloneable, Iterable< filled.retainAll(hit.getFilled()); } return filled; - */ + */ Iterator iterator = hits.iterator(); Set firstSummaryNames = getSummaryNamesNextFilledHit(iterator); if (firstSummaryNames == null || firstSummaryNames.isEmpty()) diff --git a/vespajlib/src/main/java/com/yahoo/collections/ListenableArrayList.java b/vespajlib/src/main/java/com/yahoo/collections/ListenableArrayList.java index e3f73212170..44569471049 100644 --- a/vespajlib/src/main/java/com/yahoo/collections/ListenableArrayList.java +++ b/vespajlib/src/main/java/com/yahoo/collections/ListenableArrayList.java @@ -3,13 +3,13 @@ package com.yahoo.collections; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; /** * An array list which notifies listeners after one or more items are added * * @author bratseth - * @since 5.1.17 */ @SuppressWarnings("serial") public class ListenableArrayList extends ArrayList { @@ -56,6 +56,11 @@ public class ListenableArrayList extends ArrayList { return result; } + public List listeners() { + if (listeners == null) return Collections.emptyList(); + return Collections.unmodifiableList(listeners); + } + /** * Adds a listener which is invoked whenever elements are added to this. * This may not be invoked once for each added element. -- cgit v1.2.3