diff --git a/app/lib/search/mem_index.dart b/app/lib/search/mem_index.dart index 7048ac35f4..a852e96545 100644 --- a/app/lib/search/mem_index.dart +++ b/app/lib/search/mem_index.dart @@ -29,6 +29,7 @@ class InMemoryPackageIndex { late final TokenIndex _descrIndex; late final TokenIndex _readmeIndex; late final TokenIndex _apiSymbolIndex; + late final _bitArrayPool = BitArrayPool(_documents.length); late final _scorePool = ScorePool(_packageNameIndex._packageNames); /// Maps the tag strings to a list of document index values using bit arrays. @@ -140,22 +141,21 @@ class InMemoryPackageIndex { if ((query.offset ?? 0) >= _documents.length) { return PackageSearchResult.empty(); } - return _scorePool.withScore( - value: 0.0, - fn: (score) { - return _search(query, score); - }, - ); + return _bitArrayPool.withBitArrayAllSet(fn: (array) { + return _scorePool.withScore( + value: 0.0, + fn: (score) { + return _search(query, array, score); + }, + ); + }); } PackageSearchResult _search( ServiceSearchQuery query, + BitArray packages, IndexedScore packageScores, ) { - // TODO: implement pooling of this object similarly to [ScorePool]. - final packages = BitArray(_documents.length) - ..setRange(0, _documents.length); - // filter on tags final combinedTagsPredicate = query.tagsPredicate.appendPredicate(query.parsedQuery.tagsPredicate); diff --git a/app/lib/search/token_index.dart b/app/lib/search/token_index.dart index 88ddbb2fd9..49267c19e4 100644 --- a/app/lib/search/token_index.dart +++ b/app/lib/search/token_index.dart @@ -5,6 +5,7 @@ import 'dart:math' as math; import 'package:meta/meta.dart'; +import 'package:pub_dev/third_party/bit_array/bit_array.dart'; import 'text_utils.dart'; @@ -183,6 +184,33 @@ class ScorePool { } } +/// A reusable pool for [BitArray] instances to spare some memory allocation. +class BitArrayPool { + final int _length; + final _pool = []; + + BitArrayPool(this._length); + + BitArray _acquireAllSet() { + final array = _pool.isNotEmpty ? _pool.removeLast() : BitArray(_length); + array.setRange(0, _length); + return array; + } + + void _release(BitArray array) { + _pool.add(array); + } + + R withBitArrayAllSet({ + required R Function(BitArray array) fn, + }) { + final array = _acquireAllSet(); + final r = fn(array); + _release(array); + return r; + } +} + /// Mutable score list that can accessed via integer index. class IndexedScore { final List _keys;