[
https://issues.apache.org/jira/browse/LUCENE-9335?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17340005#comment-17340005
]
Zach Chen edited comment on LUCENE-9335 at 5/6/21, 5:40 AM:
------------------------------------------------------------
No problem! Writing these scorers has actually been a great exercise for me to
understand more on the scoring related APIs and benchmark testing. I have
enjoyed it a lot!
For the profiling, are you referring to JFR? It is currently enabled by default
in luceneutil and I've added the result below from 5 "Med" terms queries
(queries file _wikimedium.10M.nostopwords.tasks.5OrMeds_ attached) :
*BMM Scorer Run 1*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 40.66 (9.7%) 32.77 (7.7%)
-19.4% ( -33% - -2%) 0.000
PKLookup 215.12 (1.5%) 221.56 (1.8%)
3.0% ( 0% - 6%) 0.000
{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 12153 events (total: 12153)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
4.24% 515
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#doAdvance()
4.22% 513
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#updateUpToAndMaxScore()
3.11% 378 java.util.LinkedList#listIterator()
2.53% 307 java.util.LinkedList$ListItr#next()
2.42% 294 java.util.zip.Inflater#inflateBytesBytes()
2.15% 261 org.apache.lucene.search.DisiPriorityQueue#pop()
1.60% 195 jdk.internal.misc.Unsafe#getByte()
1.47% 179
org.apache.lucene.search.BlockMaxMaxscoreScorer$2#matches()
1.41% 171 java.util.AbstractList$SubList#listIterator()
1.36% 165 java.util.AbstractList#listIterator()
1.31% 159
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.22% 148 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.21% 147 org.apache.lucene.search.DisiPriorityQueue#add()
1.20% 146 java.util.LinkedList$ListItr#<init>()
1.15% 140
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.11% 135
java.util.LinkedList$ListItr#checkForComodification()
1.08% 131
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.04% 126 java.nio.DirectByteBuffer#get()
1.00% 122 java.lang.Object#wait()
1.00% 122
org.apache.lucene.search.DisiPriorityQueue#downHeap()
0.95% 116 java.util.AbstractList$Itr#<init>()
0.82% 100
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.81% 98 org.apache.lucene.store.ByteBufferGuard#getByte()
0.80% 97
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.73% 89 sun.nio.fs.UnixNativeDispatcher#open0()
0.73% 89 java.lang.ClassLoader#defineClass1()
0.72% 87
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.69% 84
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.63% 77 jdk.internal.util.ArraysSupport#mismatch()
0.63% 76
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#repartitionLists()
{code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 9671 events (total: 9671)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
2.96% 286 java.util.zip.Inflater#inflateBytesBytes()
1.78% 172
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.73% 167
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.72% 166 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.57% 152 java.lang.Object#wait()
1.57% 152 org.apache.lucene.search.DisiPriorityQueue#add()
1.51% 146
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.43% 138 java.nio.DirectByteBuffer#get()
1.35% 131
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.15% 111 java.io.RandomAccessFile#readBytes()
1.10% 106 java.lang.ClassLoader#defineClass1()
1.07% 103
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.01% 98 org.apache.lucene.store.ByteBufferGuard#getByte()
1.01% 98 org.apache.lucene.search.WANDScorer#addTail()
1.00% 97
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
1.00% 97 java.io.UnixFileSystem#getBooleanAttributes0()
0.99% 96 sun.nio.fs.UnixNativeDispatcher#open0()
0.93% 90
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.90% 87
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.90% 87 java.util.Arrays#rangeCheck()
0.88% 85
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.86% 83 org.apache.lucene.search.WANDScorer#advanceTail()
0.84% 81 jdk.internal.util.ArraysSupport#mismatch()
0.80% 77 org.apache.lucene.search.WANDScorer#popTail()
0.78% 75 jdk.internal.misc.Unsafe#getByte()
0.74% 72
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.71% 69 org.apache.lucene.search.DisiPriorityQueue#pop()
0.71% 69 org.apache.lucene.search.WANDScorer$2#matches()
0.65% 63
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#scanToTermLeaf()
0.64% 62
org.apache.lucene.search.DisiPriorityQueue#top(){code}
—
*BMM Scorer Run 2*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 36.68 (10.0%) 22.26 (10.2%)
-39.3% ( -54% - -21%) 0.000
PKLookup 217.96 (9.2%) 221.95 (9.5%)
1.8% ( -15% - 22%) 0.537{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 15355 events (total: 15355)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
4.04% 621
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#doAdvance()
3.30% 507 java.util.AbstractList#subList()
3.15% 484 java.util.LinkedList#listIterator()
2.40% 369 java.util.AbstractList$SubList#listIterator()
2.38% 365 org.apache.lucene.search.DisiPriorityQueue#upHeap()
2.29% 351 java.util.zip.Inflater#inflateBytesBytes()
2.10% 323 java.util.Arrays#asList()
1.95% 300 java.util.AbstractList#listIterator()
1.83% 281 jdk.internal.misc.Unsafe#getByte()
1.75% 269 org.apache.lucene.search.WANDScorer#scaleMaxScore()
1.53% 235
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.45% 222 java.util.LinkedList$ListItr#next()
1.39% 213
org.apache.lucene.search.BlockMaxMaxscoreScorer$2#matches()
1.35% 208
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.32% 202 java.util.AbstractList$Itr#<init>()
1.15% 176 org.apache.lucene.search.DisiPriorityQueue#pop()
1.13% 174 java.nio.DirectByteBuffer#get()
1.04% 159
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.03% 158
org.apache.lucene.search.LeafSimScorer#getNormValue()
1.03% 158 java.util.AbstractList$SubList$1#nextIndex()
0.96% 148 org.apache.lucene.search.DisiPriorityQueue#top()
0.96% 147 java.util.AbstractList$Itr#next()
0.94% 145
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
0.83% 127 java.lang.Object#wait()
0.79% 122 org.apache.lucene.store.ByteBufferGuard#getByte()
0.69% 106 org.apache.lucene.store.DataInput#readVInt()
0.66% 102
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.64% 98 java.lang.Math#scalb()
0.64% 98
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.63% 96
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
{code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 11671 events (total: 11671)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
2.96% 345 java.util.zip.Inflater#inflateBytesBytes()
2.56% 299 java.io.RandomAccessFile#readBytes()
2.29% 267 org.apache.lucene.search.DisiPriorityQueue#add()
2.04% 238
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
2.01% 235
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.97% 230
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.91% 223 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.66% 194 java.nio.DirectByteBuffer#get()
1.48% 173
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
1.31% 153
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.29% 151 org.apache.lucene.search.WANDScorer#addTail()
1.24% 145 java.lang.Object#wait()
1.23% 143 org.apache.lucene.search.DisiPriorityQueue#pop()
1.17% 137 org.apache.lucene.search.WANDScorer#popTail()
1.11% 129
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.04% 121
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
1.01% 118 org.apache.lucene.search.WANDScorer$2#matches()
0.94% 110 org.apache.lucene.search.DisiPriorityQueue#top()
0.91% 106 sun.nio.fs.UnixNativeDispatcher#open0()
0.90% 105 java.io.FileInputStream#readBytes()
0.90% 105 java.lang.ClassLoader#defineClass1()
0.90% 105 org.apache.lucene.store.DataInput#readVInt()
0.90% 105
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.83% 97 org.apache.lucene.store.ByteBufferGuard#getByte()
0.80% 93 org.apache.lucene.search.WANDScorer#advanceTail()
0.75% 88 jdk.internal.misc.Unsafe#getByte()
0.72% 84
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.68% 79 perf.PKLookupTask#go()
0.68% 79 java.io.UnixFileSystem#getBooleanAttributes0()
0.65% 76 org.apache.lucene.search.WANDScorer#upHeapMaxScore()
{code}
----
*BMM BulkScorer Run 1*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 34.58 (16.9%) 28.75 (9.0%)
-16.9% ( -36% - 10%) 0.000
PKLookup 223.50 (2.6%) 229.67 (2.6%)
2.8% ( -2% - 8%) 0.001
{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 12720 events (total: 12720)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
3.18% 405 java.util.LinkedList#listIterator()
2.62% 333 java.util.zip.Inflater#inflateBytesBytes()
2.43% 309
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$1#doAdvance()
2.21% 281 java.util.AbstractList#subList()
2.16% 275 org.apache.lucene.search.WANDScorer#scaleMaxScore()
1.96% 249
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$2#matches()
1.94% 247 jdk.internal.misc.Unsafe#getByte()
1.71% 217 java.util.Arrays#asList()
1.68% 214 java.util.AbstractList#listIterator()
1.66% 211 java.util.AbstractList$SubList#listIterator()
1.63% 207 java.util.LinkedList$ListItr#next()
1.37% 174 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.26% 160 java.lang.Object#wait()
1.16% 148
org.apache.lucene.search.LeafSimScorer#getNormValue()
1.12% 143
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.04% 132 java.nio.DirectByteBuffer#get()
1.03% 131
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.03% 131 java.util.AbstractList$Itr#<init>()
0.96% 122
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
0.91% 116
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer#updateIntervalBoundary()
0.90% 114 jdk.internal.util.ArraysSupport#mismatch()
0.89% 113 org.apache.lucene.search.DisiPriorityQueue#pop()
0.88% 112 java.util.AbstractList$SubList$1#nextIndex()
0.83% 105
org.apache.lucene.search.DisiPriorityQueue#downHeap()
0.74% 94
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.73% 93 org.apache.lucene.store.ByteBufferGuard#getByte()
0.73% 93
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.72% 91 sun.nio.fs.UnixNativeDispatcher#open0()
0.72% 91 org.apache.lucene.search.DisiPriorityQueue#add()
0.68% 86 org.apache.lucene.search.DisiPriorityQueue#top()
{code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 9996 events (total: 9996)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
3.16% 316 java.util.zip.Inflater#inflateBytesBytes()
1.89% 189
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.74% 174
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.73% 173
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.65% 165 org.apache.lucene.search.DisiPriorityQueue#add()
1.63% 163 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.62% 162 java.io.RandomAccessFile#readBytes()
1.46% 146 java.lang.Object#wait()
1.41% 141
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.21% 121 org.apache.lucene.search.WANDScorer#addTail()
1.16% 116
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.11% 111 jdk.internal.util.ArraysSupport#mismatch()
1.04% 104 java.nio.DirectByteBuffer#get()
1.02% 102
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
1.00% 100
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.98% 98 org.apache.lucene.search.WANDScorer$2#matches()
0.94% 94 org.apache.lucene.search.DisiPriorityQueue#pop()
0.94% 94 org.apache.lucene.search.WANDScorer#popTail()
0.91% 91 org.apache.lucene.search.DisiPriorityQueue#top()
0.86% 86 org.apache.lucene.util.BytesRef#compareTo()
0.85% 85 org.apache.lucene.store.ByteBufferGuard#getByte()
0.82% 82 java.io.UnixFileSystem#getBooleanAttributes0()
0.79% 79 sun.nio.fs.UnixNativeDispatcher#open0()
0.78% 78 jdk.internal.misc.Unsafe#getByte()
0.77% 77
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.73% 73 java.lang.ClassLoader#defineClass1()
0.73% 73 org.apache.lucene.search.WANDScorer#advanceTail()
0.70% 70
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
0.69% 69
java.lang.invoke.InvokerBytecodeGenerator#emitStaticInvoke()
0.67% 67 perf.PKLookupTask#go(){code}
*—*
*BMM BulkScorer Run 2*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 38.91 (10.4%) 22.19 (4.1%)
-43.0% ( -52% - -31%) 0.000
PKLookup 220.07 (5.4%) 226.90 (3.1%)
3.1% ( -5% - 12%) 0.026{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 15143 events (total: 15143)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
3.94% 596
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$1#doAdvance()
3.52% 533 java.util.AbstractList#subList()
3.20% 485 java.util.LinkedList#listIterator()
2.81% 426 java.util.AbstractList$SubList#listIterator()
2.72% 412 org.apache.lucene.search.WANDScorer#scaleMaxScore()
2.44% 369 java.util.AbstractList#listIterator()
2.37% 359 org.apache.lucene.search.DisiPriorityQueue#upHeap()
2.27% 343 java.util.Arrays#asList()
2.15% 326 java.util.zip.Inflater#inflateBytesBytes()
1.71% 259 jdk.internal.misc.Unsafe#getByte()
1.44% 218 java.util.AbstractList$Itr#<init>()
1.40% 212
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.35% 205 java.util.LinkedList$ListItr#next()
1.33% 202
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$2#matches()
1.31% 199 org.apache.lucene.search.DisiPriorityQueue#pop()
1.20% 182 java.nio.DirectByteBuffer#get()
1.10% 167 java.util.AbstractList$SubList$1#nextIndex()
1.07% 162 java.util.AbstractList$Itr#next()
0.99% 150
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
0.96% 146
org.apache.lucene.search.LeafSimScorer#getNormValue()
0.94% 143
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
0.92% 139 org.apache.lucene.search.DisiPriorityQueue#top()
0.90% 137 java.lang.Object#wait()
0.79% 119
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer#updateIntervalBoundary()
0.77% 117
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
0.71% 108 java.util.AbstractList$SubList$1#<init>()
0.71% 108 org.apache.lucene.store.ByteBufferGuard#getByte()
0.67% 101 sun.nio.fs.UnixNativeDispatcher#open0()
0.66% 100
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.61% 93 java.lang.ClassLoader#defineClass1(){code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 10813 events (total: 10813)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
2.67% 289 org.apache.lucene.search.DisiPriorityQueue#add()
2.57% 278 java.util.zip.Inflater#inflateBytesBytes()
2.23% 241
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.96% 212 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.91% 207
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.65% 178 java.lang.Object#wait()
1.49% 161 java.nio.DirectByteBuffer#get()
1.36% 147 org.apache.lucene.search.DisiPriorityQueue#top()
1.34% 145
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.29% 139
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.29% 139 org.apache.lucene.search.WANDScorer#addTail()
1.28% 138
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.17% 126
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
1.16% 125 org.apache.lucene.search.DisiPriorityQueue#pop()
1.15% 124 org.apache.lucene.search.WANDScorer$2#matches()
1.09% 118 org.apache.lucene.search.WANDScorer#popTail()
1.04% 112 org.apache.lucene.search.WANDScorer#advanceTail()
1.00% 108 org.apache.lucene.store.ByteBufferGuard#getByte()
0.96% 104
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.95% 103
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.92% 99 sun.nio.fs.UnixNativeDispatcher#open0()
0.89% 96
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.86% 93 java.lang.ClassLoader#defineClass1()
0.83% 90 jdk.internal.misc.Unsafe#getByte()
0.80% 86 java.util.Arrays#compareUnsigned()
0.79% 85 org.apache.lucene.search.WANDScorer#upHeapMaxScore()
0.76% 82 perf.PKLookupTask#go()
0.68% 74 org.apache.lucene.search.WANDScorer#pushBackLeads()
0.68% 74 java.io.RandomAccessFile#readBytes()
0.68% 74
org.apache.lucene.search.similarities.BM25Similarity$BM25Scorer#score()
{code}
I think what stands out from these comparisons is, the 2 BMM implementations
spent a lot of CPU cycles in checking and advancing to the next candidate doc,
whereas WAND spent time in advancing at the posting reader level. Maybe the BMM
implementations did not propagate minScore correctly / effectively to the
underlying scorers so that a lot more candidate docs were surfaced from
TermScorer? Another possibility is BMM may indeed require more operations than
BMW, as suggested by the paper. I will check more and get back to this...
was (Author: zacharymorn):
No problem! Writing these scorers has actually been a great exercise for me to
understand more on the scoring related APIs and benchmark testing. I have
enjoyed it a lot!
For the profiling, are you referring to JFR? It is currently enabled by default
in luceneutil and I've added the result below from 5 "Med" terms queries
(queries file _wikimedium.10M.nostopwords.tasks.5OrMeds_ attached) :
*BMM Scorer Run 1*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 40.66 (9.7%) 32.77 (7.7%)
-19.4% ( -33% - -2%) 0.000
PKLookup 215.12 (1.5%) 221.56 (1.8%)
3.0% ( 0% - 6%) 0.000
{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 12153 events (total: 12153)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
4.24% 515
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#doAdvance()
4.22% 513
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#updateUpToAndMaxScore()
3.11% 378 java.util.LinkedList#listIterator()
2.53% 307 java.util.LinkedList$ListItr#next()
2.42% 294 java.util.zip.Inflater#inflateBytesBytes()
2.15% 261 org.apache.lucene.search.DisiPriorityQueue#pop()
1.60% 195 jdk.internal.misc.Unsafe#getByte()
1.47% 179
org.apache.lucene.search.BlockMaxMaxscoreScorer$2#matches()
1.41% 171 java.util.AbstractList$SubList#listIterator()
1.36% 165 java.util.AbstractList#listIterator()
1.31% 159
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.22% 148 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.21% 147 org.apache.lucene.search.DisiPriorityQueue#add()
1.20% 146 java.util.LinkedList$ListItr#<init>()
1.15% 140
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.11% 135
java.util.LinkedList$ListItr#checkForComodification()
1.08% 131
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.04% 126 java.nio.DirectByteBuffer#get()
1.00% 122 java.lang.Object#wait()
1.00% 122
org.apache.lucene.search.DisiPriorityQueue#downHeap()
0.95% 116 java.util.AbstractList$Itr#<init>()
0.82% 100
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.81% 98 org.apache.lucene.store.ByteBufferGuard#getByte()
0.80% 97
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.73% 89 sun.nio.fs.UnixNativeDispatcher#open0()
0.73% 89 java.lang.ClassLoader#defineClass1()
0.72% 87
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.69% 84
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.63% 77 jdk.internal.util.ArraysSupport#mismatch()
0.63% 76
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#repartitionLists()
{code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 9671 events (total: 9671)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
2.96% 286 java.util.zip.Inflater#inflateBytesBytes()
1.78% 172
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.73% 167
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.72% 166 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.57% 152 java.lang.Object#wait()
1.57% 152 org.apache.lucene.search.DisiPriorityQueue#add()
1.51% 146
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.43% 138 java.nio.DirectByteBuffer#get()
1.35% 131
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.15% 111 java.io.RandomAccessFile#readBytes()
1.10% 106 java.lang.ClassLoader#defineClass1()
1.07% 103
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.01% 98 org.apache.lucene.store.ByteBufferGuard#getByte()
1.01% 98 org.apache.lucene.search.WANDScorer#addTail()
1.00% 97
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
1.00% 97 java.io.UnixFileSystem#getBooleanAttributes0()
0.99% 96 sun.nio.fs.UnixNativeDispatcher#open0()
0.93% 90
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.90% 87
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.90% 87 java.util.Arrays#rangeCheck()
0.88% 85
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.86% 83 org.apache.lucene.search.WANDScorer#advanceTail()
0.84% 81 jdk.internal.util.ArraysSupport#mismatch()
0.80% 77 org.apache.lucene.search.WANDScorer#popTail()
0.78% 75 jdk.internal.misc.Unsafe#getByte()
0.74% 72
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.71% 69 org.apache.lucene.search.DisiPriorityQueue#pop()
0.71% 69 org.apache.lucene.search.WANDScorer$2#matches()
0.65% 63
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#scanToTermLeaf()
0.64% 62
org.apache.lucene.search.DisiPriorityQueue#top(){code}
---
*BMM Scorer Run 2*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 36.68 (10.0%) 22.26 (10.2%)
-39.3% ( -54% - -21%) 0.000
PKLookup 217.96 (9.2%) 221.95 (9.5%)
1.8% ( -15% - 22%) 0.537{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 15355 events (total: 15355)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
4.04% 621
org.apache.lucene.search.BlockMaxMaxscoreScorer$1#doAdvance()
3.30% 507 java.util.AbstractList#subList()
3.15% 484 java.util.LinkedList#listIterator()
2.40% 369 java.util.AbstractList$SubList#listIterator()
2.38% 365 org.apache.lucene.search.DisiPriorityQueue#upHeap()
2.29% 351 java.util.zip.Inflater#inflateBytesBytes()
2.10% 323 java.util.Arrays#asList()
1.95% 300 java.util.AbstractList#listIterator()
1.83% 281 jdk.internal.misc.Unsafe#getByte()
1.75% 269 org.apache.lucene.search.WANDScorer#scaleMaxScore()
1.53% 235
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.45% 222 java.util.LinkedList$ListItr#next()
1.39% 213
org.apache.lucene.search.BlockMaxMaxscoreScorer$2#matches()
1.35% 208
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.32% 202 java.util.AbstractList$Itr#<init>()
1.15% 176 org.apache.lucene.search.DisiPriorityQueue#pop()
1.13% 174 java.nio.DirectByteBuffer#get()
1.04% 159
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.03% 158
org.apache.lucene.search.LeafSimScorer#getNormValue()
1.03% 158 java.util.AbstractList$SubList$1#nextIndex()
0.96% 148 org.apache.lucene.search.DisiPriorityQueue#top()
0.96% 147 java.util.AbstractList$Itr#next()
0.94% 145
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
0.83% 127 java.lang.Object#wait()
0.79% 122 org.apache.lucene.store.ByteBufferGuard#getByte()
0.69% 106 org.apache.lucene.store.DataInput#readVInt()
0.66% 102
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.64% 98 java.lang.Math#scalb()
0.64% 98
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.63% 96
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
{code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 11671 events (total: 11671)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
2.96% 345 java.util.zip.Inflater#inflateBytesBytes()
2.56% 299 java.io.RandomAccessFile#readBytes()
2.29% 267 org.apache.lucene.search.DisiPriorityQueue#add()
2.04% 238
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
2.01% 235
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.97% 230
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.91% 223 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.66% 194 java.nio.DirectByteBuffer#get()
1.48% 173
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
1.31% 153
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.29% 151 org.apache.lucene.search.WANDScorer#addTail()
1.24% 145 java.lang.Object#wait()
1.23% 143 org.apache.lucene.search.DisiPriorityQueue#pop()
1.17% 137 org.apache.lucene.search.WANDScorer#popTail()
1.11% 129
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.04% 121
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
1.01% 118 org.apache.lucene.search.WANDScorer$2#matches()
0.94% 110 org.apache.lucene.search.DisiPriorityQueue#top()
0.91% 106 sun.nio.fs.UnixNativeDispatcher#open0()
0.90% 105 java.io.FileInputStream#readBytes()
0.90% 105 java.lang.ClassLoader#defineClass1()
0.90% 105 org.apache.lucene.store.DataInput#readVInt()
0.90% 105
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnumFrame#loadBlock()
0.83% 97 org.apache.lucene.store.ByteBufferGuard#getByte()
0.80% 93 org.apache.lucene.search.WANDScorer#advanceTail()
0.75% 88 jdk.internal.misc.Unsafe#getByte()
0.72% 84
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.68% 79 perf.PKLookupTask#go()
0.68% 79 java.io.UnixFileSystem#getBooleanAttributes0()
0.65% 76 org.apache.lucene.search.WANDScorer#upHeapMaxScore()
{code}
----
*BMM BulkScorer Run 1*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 34.58 (16.9%) 28.75 (9.0%)
-16.9% ( -36% - 10%) 0.000
PKLookup 223.50 (2.6%) 229.67 (2.6%)
2.8% ( -2% - 8%) 0.001
{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 12720 events (total: 12720)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
3.18% 405 java.util.LinkedList#listIterator()
2.62% 333 java.util.zip.Inflater#inflateBytesBytes()
2.43% 309
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$1#doAdvance()
2.21% 281 java.util.AbstractList#subList()
2.16% 275 org.apache.lucene.search.WANDScorer#scaleMaxScore()
1.96% 249
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$2#matches()
1.94% 247 jdk.internal.misc.Unsafe#getByte()
1.71% 217 java.util.Arrays#asList()
1.68% 214 java.util.AbstractList#listIterator()
1.66% 211 java.util.AbstractList$SubList#listIterator()
1.63% 207 java.util.LinkedList$ListItr#next()
1.37% 174 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.26% 160 java.lang.Object#wait()
1.16% 148
org.apache.lucene.search.LeafSimScorer#getNormValue()
1.12% 143
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.04% 132 java.nio.DirectByteBuffer#get()
1.03% 131
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.03% 131 java.util.AbstractList$Itr#<init>()
0.96% 122
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
0.91% 116
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer#updateIntervalBoundary()
0.90% 114 jdk.internal.util.ArraysSupport#mismatch()
0.89% 113 org.apache.lucene.search.DisiPriorityQueue#pop()
0.88% 112 java.util.AbstractList$SubList$1#nextIndex()
0.83% 105
org.apache.lucene.search.DisiPriorityQueue#downHeap()
0.74% 94
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.73% 93 org.apache.lucene.store.ByteBufferGuard#getByte()
0.73% 93
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.72% 91 sun.nio.fs.UnixNativeDispatcher#open0()
0.72% 91 org.apache.lucene.search.DisiPriorityQueue#add()
0.68% 86 org.apache.lucene.search.DisiPriorityQueue#top()
{code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 9996 events (total: 9996)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
3.16% 316 java.util.zip.Inflater#inflateBytesBytes()
1.89% 189
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.74% 174
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.73% 173
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.65% 165 org.apache.lucene.search.DisiPriorityQueue#add()
1.63% 163 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.62% 162 java.io.RandomAccessFile#readBytes()
1.46% 146 java.lang.Object#wait()
1.41% 141
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.21% 121 org.apache.lucene.search.WANDScorer#addTail()
1.16% 116
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.11% 111 jdk.internal.util.ArraysSupport#mismatch()
1.04% 104 java.nio.DirectByteBuffer#get()
1.02% 102
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
1.00% 100
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.98% 98 org.apache.lucene.search.WANDScorer$2#matches()
0.94% 94 org.apache.lucene.search.DisiPriorityQueue#pop()
0.94% 94 org.apache.lucene.search.WANDScorer#popTail()
0.91% 91 org.apache.lucene.search.DisiPriorityQueue#top()
0.86% 86 org.apache.lucene.util.BytesRef#compareTo()
0.85% 85 org.apache.lucene.store.ByteBufferGuard#getByte()
0.82% 82 java.io.UnixFileSystem#getBooleanAttributes0()
0.79% 79 sun.nio.fs.UnixNativeDispatcher#open0()
0.78% 78 jdk.internal.misc.Unsafe#getByte()
0.77% 77
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.73% 73 java.lang.ClassLoader#defineClass1()
0.73% 73 org.apache.lucene.search.WANDScorer#advanceTail()
0.70% 70
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
0.69% 69
java.lang.invoke.InvokerBytecodeGenerator#emitStaticInvoke()
0.67% 67 perf.PKLookupTask#go(){code}
----
*BMM BulkScorer Run 2*
{code:java}
TaskQPS baseline StdDevQPS my_modified_version
StdDev Pct diff p-value
OrMedMedMedMedMed 38.91 (10.4%) 22.19 (4.1%)
-43.0% ( -52% - -31%) 0.000
PKLookup 220.07 (5.4%) 226.90 (3.1%)
3.1% ( -5% - 12%) 0.026{code}
CPU merged search profile for my_modified_version:
{code:java}
PROFILE SUMMARY from 15143 events (total: 15143)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
3.94% 596
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$1#doAdvance()
3.52% 533 java.util.AbstractList#subList()
3.20% 485 java.util.LinkedList#listIterator()
2.81% 426 java.util.AbstractList$SubList#listIterator()
2.72% 412 org.apache.lucene.search.WANDScorer#scaleMaxScore()
2.44% 369 java.util.AbstractList#listIterator()
2.37% 359 org.apache.lucene.search.DisiPriorityQueue#upHeap()
2.27% 343 java.util.Arrays#asList()
2.15% 326 java.util.zip.Inflater#inflateBytesBytes()
1.71% 259 jdk.internal.misc.Unsafe#getByte()
1.44% 218 java.util.AbstractList$Itr#<init>()
1.40% 212
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.35% 205 java.util.LinkedList$ListItr#next()
1.33% 202
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer$2#matches()
1.31% 199 org.apache.lucene.search.DisiPriorityQueue#pop()
1.20% 182 java.nio.DirectByteBuffer#get()
1.10% 167 java.util.AbstractList$SubList$1#nextIndex()
1.07% 162 java.util.AbstractList$Itr#next()
0.99% 150
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
0.96% 146
org.apache.lucene.search.LeafSimScorer#getNormValue()
0.94% 143
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
0.92% 139 org.apache.lucene.search.DisiPriorityQueue#top()
0.90% 137 java.lang.Object#wait()
0.79% 119
org.apache.lucene.search.BMMBulkScorer$BMMBoundaryAwareScorer#updateIntervalBoundary()
0.77% 117
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
0.71% 108 java.util.AbstractList$SubList$1#<init>()
0.71% 108 org.apache.lucene.store.ByteBufferGuard#getByte()
0.67% 101 sun.nio.fs.UnixNativeDispatcher#open0()
0.66% 100
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.61% 93 java.lang.ClassLoader#defineClass1(){code}
CPU merged search profile for baseline:
{code:java}
PROFILE SUMMARY from 10813 events (total: 10813)
tests.profile.mode=cpu
tests.profile.count=30
tests.profile.stacksize=1
tests.profile.linenumbers=false
PERCENT CPU SAMPLES STACK
2.67% 289 org.apache.lucene.search.DisiPriorityQueue#add()
2.57% 278 java.util.zip.Inflater#inflateBytesBytes()
2.23% 241
org.apache.lucene.search.DisiPriorityQueue#downHeap()
1.96% 212 org.apache.lucene.search.DisiPriorityQueue#upHeap()
1.91% 207
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader$BlockImpactsDocsEnum#advance()
1.65% 178 java.lang.Object#wait()
1.49% 161 java.nio.DirectByteBuffer#get()
1.36% 147 org.apache.lucene.search.DisiPriorityQueue#top()
1.34% 145
org.apache.lucene.codecs.lucene90.Lucene90PostingsReader#findFirstGreater()
1.29% 139
org.apache.lucene.codecs.lucene90.blocktree.SegmentTermsEnum#seekExact()
1.29% 139 org.apache.lucene.search.WANDScorer#addTail()
1.28% 138
java.lang.invoke.InvokerBytecodeGenerator#isStaticallyInvocable()
1.17% 126
org.apache.lucene.search.WANDScorer#moveToNextCandidate()
1.16% 125 org.apache.lucene.search.DisiPriorityQueue#pop()
1.15% 124 org.apache.lucene.search.WANDScorer$2#matches()
1.09% 118 org.apache.lucene.search.WANDScorer#popTail()
1.04% 112 org.apache.lucene.search.WANDScorer#advanceTail()
1.00% 108 org.apache.lucene.store.ByteBufferGuard#getByte()
0.96% 104
org.apache.lucene.codecs.lucene90.PForUtil#innerPrefixSum32()
0.95% 103
java.lang.invoke.InvokerBytecodeGenerator#emitImplicitConversion()
0.92% 99 sun.nio.fs.UnixNativeDispatcher#open0()
0.89% 96
java.util.regex.Pattern$BmpCharPredicate$$Lambda$103.530539368#is()
0.86% 93 java.lang.ClassLoader#defineClass1()
0.83% 90 jdk.internal.misc.Unsafe#getByte()
0.80% 86 java.util.Arrays#compareUnsigned()
0.79% 85 org.apache.lucene.search.WANDScorer#upHeapMaxScore()
0.76% 82 perf.PKLookupTask#go()
0.68% 74 org.apache.lucene.search.WANDScorer#pushBackLeads()
0.68% 74 java.io.RandomAccessFile#readBytes()
0.68% 74
org.apache.lucene.search.similarities.BM25Similarity$BM25Scorer#score()
{code}
I think what stands out from these comparisons is, the 2 BMM implementations
spent a lot of CPU cycles in checking and advancing to the next candidate doc,
whereas WAND spent time in advancing at the posting reader level. Maybe the BMM
implementations did not propagate minScore correctly / effectively to the
underlying scorers so that a lot more candidate docs were surfaced from
TermScorer? Another possibility is BMM may indeed require more operations than
BMW, as suggested by the paper. I will check more and get back to this...
> Add a bulk scorer for disjunctions that does dynamic pruning
> ------------------------------------------------------------
>
> Key: LUCENE-9335
> URL: https://issues.apache.org/jira/browse/LUCENE-9335
> Project: Lucene - Core
> Issue Type: Improvement
> Reporter: Adrien Grand
> Priority: Minor
> Attachments: wikimedium.10M.nostopwords.tasks,
> wikimedium.10M.nostopwords.tasks.5OrMeds
>
> Time Spent: 2h 40m
> Remaining Estimate: 0h
>
> Lucene often gets benchmarked against other engines, e.g. against Tantivy and
> PISA at [https://tantivy-search.github.io/bench/] or against research
> prototypes in Table 1 of
> [https://cs.uwaterloo.ca/~jimmylin/publications/Grand_etal_ECIR2020_preprint.pdf].
> Given that top-level disjunctions of term queries are commonly used for
> benchmarking, it would be nice to optimize this case a bit more, I suspect
> that we could make fewer per-document decisions by implementing a BulkScorer
> instead of a Scorer.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]