From c7ff52ddd9b21c68b943f08897ecc1fddd61180d Mon Sep 17 00:00:00 2001 From: Tim Underwood Date: Wed, 17 Oct 2018 14:48:52 -0700 Subject: [PATCH] SOLR-12882: Eliminate excessive lambda allocation in FacetFieldProcessorByHashDV.collectValFirstPhase --- .../facet/FacetFieldProcessorByHashDV.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java index 4c0b244c1dd4..c246c210217c 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldProcessorByHashDV.java @@ -430,12 +430,20 @@ private void collectValFirstPhase(int segDoc, long val) throws IOException { // Our countAcc is virtual, so this is not needed: // countAcc.incrementCount(slot, 1); - super.collectFirstPhase(segDoc, slot, slotNum -> { - Comparable value = calc.bitsToValue(val); - return new SlotContext(sf.getType().getFieldQuery(null, sf, calc.formatValue(value))); - }); + super.collectFirstPhase(segDoc, slot, slotContext); } + /** + * SlotContext to use during all {@link SlotAcc} collection. + * + * This avoids a memory allocation for each invocation of collectValFirstPhase. + */ + private IntFunction slotContext = (slotNum) -> { + long val = table.vals[slotNum]; + Comparable value = calc.bitsToValue(val); + return new SlotContext(sf.getType().getFieldQuery(null, sf, calc.formatValue(value))); + }; + private void doRehash(LongCounts table) { if (collectAcc == null && allBucketsAcc == null) return;