You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2021/10/02 12:31:55 UTC

[lucene] branch main updated: LUCENE-10130: small optimizations to SparseFixedBitSet set() codepath

This is an automated email from the ASF dual-hosted git repository.

rmuir pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/main by this push:
     new 3dee08a  LUCENE-10130: small optimizations to SparseFixedBitSet set() codepath
3dee08a is described below

commit 3dee08a09a36e782fa750416e54d9490733b2c48
Author: Robert Muir <rm...@apache.org>
AuthorDate: Sat Oct 2 08:30:54 2021 -0400

    LUCENE-10130: small optimizations to SparseFixedBitSet set() codepath
    
    Don't spend so many cycles updating ramBytesUsed when setting each bit.
    Avoid recomputing some shifts that the caller already computes.
---
 .../org/apache/lucene/util/SparseFixedBitSet.java  | 23 +++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java b/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java
index afe30bf..02849c1 100644
--- a/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java
+++ b/lucene/core/src/java/org/apache/lucene/util/SparseFixedBitSet.java
@@ -149,13 +149,13 @@ public class SparseFixedBitSet extends BitSet {
     } else if (index == 0) {
       // if the index is 0, it means that we just found a block of 4096 bits
       // that has no bit that is set yet. So let's initialize a new block:
-      insertBlock(i4096, i64, i);
+      insertBlock(i4096, i64bit, i);
       return false;
     } else {
       // in that case we found a block of 4096 bits that has some values, but
       // the sub-block of 64 bits that we are interested in has no value yet,
       // so we need to insert a new long
-      insertLong(i4096, i64, i, index);
+      insertLong(i4096, i64bit, i, index);
       return false;
     }
   }
@@ -184,32 +184,32 @@ public class SparseFixedBitSet extends BitSet {
     } else if (index == 0) {
       // if the index is 0, it means that we just found a block of 4096 bits
       // that has no bit that is set yet. So let's initialize a new block:
-      insertBlock(i4096, i64, i);
+      insertBlock(i4096, i64bit, i);
     } else {
       // in that case we found a block of 4096 bits that has some values, but
       // the sub-block of 64 bits that we are interested in has no value yet,
       // so we need to insert a new long
-      insertLong(i4096, i64, i, index);
+      insertLong(i4096, i64bit, i, index);
     }
   }
 
-  private void insertBlock(int i4096, int i64, int i) {
-    indices[i4096] = 1L << i64; // shifts are mod 64 in java
+  private void insertBlock(int i4096, long i64bit, int i) {
+    indices[i4096] = i64bit;
     assert bits[i4096] == null;
     bits[i4096] = new long[] {1L << i}; // shifts are mod 64 in java
     ++nonZeroLongCount;
     ramBytesUsed += SINGLE_ELEMENT_ARRAY_BYTES_USED;
   }
 
-  private void insertLong(int i4096, int i64, int i, long index) {
-    indices[i4096] |= 1L << i64; // shifts are mod 64 in java
+  private void insertLong(int i4096, long i64bit, int i, long index) {
+    indices[i4096] |= i64bit;
     // we count the number of bits that are set on the right of i64
     // this gives us the index at which to perform the insertion
-    final int o = Long.bitCount(index & ((1L << i64) - 1));
+    final int o = Long.bitCount(index & (i64bit - 1));
     final long[] bitArray = bits[i4096];
     if (bitArray[bitArray.length - 1] == 0) {
       // since we only store non-zero longs, if the last value is 0, it means
-      // that we alreay have extra space, make use of it
+      // that we already have extra space, make use of it
       System.arraycopy(bitArray, o, bitArray, o + 1, bitArray.length - o - 1);
       bitArray[o] = 1L << i;
     } else {
@@ -220,7 +220,8 @@ public class SparseFixedBitSet extends BitSet {
       newBitArray[o] = 1L << i;
       System.arraycopy(bitArray, o, newBitArray, o + 1, bitArray.length - o);
       bits[i4096] = newBitArray;
-      ramBytesUsed += RamUsageEstimator.sizeOf(newBitArray) - RamUsageEstimator.sizeOf(bitArray);
+      // we may slightly overestimate size here, but keep it cheap
+      ramBytesUsed += (newBitArray.length - bitArray.length) << 3;
     }
     ++nonZeroLongCount;
   }