[ 
https://issues.apache.org/jira/browse/COLLECTIONS-823?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alex Herbert resolved COLLECTIONS-823.
--------------------------------------
    Resolution: Done

> BloomFilter: Optimize ArrayCountingBloomFilter.ForEachBitMap
> ------------------------------------------------------------
>
>                 Key: COLLECTIONS-823
>                 URL: https://issues.apache.org/jira/browse/COLLECTIONS-823
>             Project: Commons Collections
>          Issue Type: Improvement
>          Components: Collection
>    Affects Versions: 4.5
>            Reporter: Claude Warren
>            Assignee: Claude Warren
>            Priority: Minor
>              Labels: bloom-filter
>             Fix For: 4.5
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
>  
>  
>  Member 
> h3. 
> !https://avatars.githubusercontent.com/u/886334?s=48&v=4|width=24,height=24!  
> *[aherbert|https://github.com/aherbert]*  [on 27 
> Feb|https://github.com/apache/commons-collections/pull/258#discussion_r812499923]
> This converts all the non zero indices to a bitmap long[] array. But to do so 
> requires using the {{forEachIndex}} method with a conditional boolean check 
> on each loop iteration. I wonder if this should be brought inline for 
> efficiency:
> {noformat}
>      @Override
>     public boolean forEachBitMap(LongPredicate consumer) {
>         Objects.requireNonNull(consumer, "consumer");
>         long[] result = new 
> long[BitMap.numberOfBitMaps(shape.getNumberOfBits())];
>         for (int i = 0; i < counts.length; i++) {
>             if (counts[i] != 0) {
>                 // Avoids a second check on the predicate result in 
> forEachIndex
>                 BitMap.set(result, i);
>             }
>         }
>         return BitMapProducer.fromBitMapArray(result).forEachBitMap(consumer);
>     }
> {noformat}
> Or better yet, avoid the {{long[]}} array:
> {noformat}
>         int blocksm1 = BitMap.numberOfBitMaps(shape.getNumberOfBits()) - 1;
>         int i = 0;
>         long value;
>         for (int j = 0; j < blocksm1; j++) {
>             value = 0;
>             for (int k = 0; k < Long.SIZE; k++) {
>                 if (counts[i++] != 0) {
>                     value |= BitMap.getLongBit(k);
>                 }
>             }
>             if (!consumer.test(value)) {
>                 return false;
>             }
>         }
>         // Final block
>         value = 0;
>         for (int k = 0; i < counts.length; k++) {
>             if (counts[i++] != 0) {
>                 value |= BitMap.getLongBit(k);
>             }
>         }
>         return consumer.test(value);
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to