Skip to content

Commit ede227d

Browse files
Speedup ContextIndexSearcher
We can do a little better here and create less garbage + save cycles for method calls when doing all the sorting.
1 parent dbf388c commit ede227d

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

server/src/main/java/org/elasticsearch/search/internal/ContextIndexSearcher.java

+12-7
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import java.util.ArrayList;
5050
import java.util.Arrays;
5151
import java.util.Collections;
52-
import java.util.Comparator;
5352
import java.util.List;
5453
import java.util.Objects;
5554
import java.util.PriorityQueue;
@@ -255,13 +254,11 @@ private static LeafSlice[] computeSlices(List<LeafReaderContext> leaves, int min
255254
// Make a copy so we can sort:
256255
List<LeafReaderContext> sortedLeaves = new ArrayList<>(leaves);
257256
// Sort by maxDoc, descending:
258-
final Comparator<LeafReaderContext> leafComparator = Comparator.comparingInt(l -> l.reader().maxDoc());
259-
sortedLeaves.sort(leafComparator.reversed());
257+
sortedLeaves.sort((c1, c2) -> Integer.compare(c2.reader().maxDoc(), c1.reader().maxDoc()));
260258
// we add the groups on a priority queue, so we can add orphan leafs to the smallest group
261-
final Comparator<List<LeafReaderContext>> groupComparator = Comparator.comparingInt(
262-
l -> l.stream().mapToInt(lr -> lr.reader().maxDoc()).sum()
259+
final PriorityQueue<List<LeafReaderContext>> queue = new PriorityQueue<>(
260+
(c1, c2) -> Integer.compare(sumMaxDocValues(c1), sumMaxDocValues(c2))
263261
);
264-
final PriorityQueue<List<LeafReaderContext>> queue = new PriorityQueue<>(groupComparator);
265262
long docSum = 0;
266263
List<LeafReaderContext> group = new ArrayList<>();
267264
for (LeafReaderContext ctx : sortedLeaves) {
@@ -297,6 +294,14 @@ private static LeafSlice[] computeSlices(List<LeafReaderContext> leaves, int min
297294
return slices;
298295
}
299296

297+
private static int sumMaxDocValues(List<LeafReaderContext> l) {
298+
int sum = 0;
299+
for (LeafReaderContext lr : l) {
300+
sum += lr.reader().maxDoc();
301+
}
302+
return sum;
303+
}
304+
300305
@Override
301306
public <C extends Collector, T> T search(Query query, CollectorManager<C, T> collectorManager) throws IOException {
302307
final C firstCollector = collectorManager.newCollector();
@@ -337,7 +342,7 @@ private <C extends Collector, T> T search(Weight weight, CollectorManager<C, T>
337342
throw new IllegalStateException("CollectorManager does not always produce collectors with the same score mode");
338343
}
339344
}
340-
final List<Callable<C>> listTasks = new ArrayList<>();
345+
final List<Callable<C>> listTasks = new ArrayList<>(leafSlices.length);
341346
for (int i = 0; i < leafSlices.length; ++i) {
342347
final LeafReaderContext[] leaves = leafSlices[i].leaves;
343348
final C collector = collectors.get(i);

0 commit comments

Comments
 (0)