Преглед на файлове

Use binary search for inner loop in IndexedReader

This adds at least one memory allocation (`collect` into a `Vec`) but is still faster for a reasonable number of IDs.
Johannes Hofmann преди 5 години
родител
ревизия
31a48ba07f
променени са 1 файла, в които са добавени 4 реда и са изтрити 2 реда
  1. 4
    2
      src/indexed.rs

+ 4
- 2
src/indexed.rs Целия файл

@@ -204,6 +204,8 @@ impl<R: Read + Seek> IndexedReader<R> {
204 204
             if info.blob_type == SimpleBlobType::Primitive {
205 205
                 if let Some(node_id_range) = info.id_ranges.as_ref().and_then(|r| r.node_ids.as_ref()) {
206 206
                     if range_included(node_id_range.clone(), &node_ids) {
207
+                        //TODO Only collect into Vec if range has a reasonable size
208
+                        let node_ids: Vec<i64> = node_ids.range(node_id_range.clone()).map(|x| *x).collect();
207 209
                         self.reader.seek(info.offset)?;
208 210
                         let blob = self.reader.next().ok_or_else(|| {
209 211
                             ::std::io::Error::new(
@@ -214,13 +216,13 @@ impl<R: Read + Seek> IndexedReader<R> {
214 216
                         let block = blob.to_primitiveblock()?;
215 217
                         for group in block.groups() {
216 218
                             for node in group.nodes() {
217
-                                if node_ids.contains(&node.id()) {
219
+                                if node_ids.binary_search(&node.id()).is_ok() {
218 220
                                     // ID found, return node
219 221
                                     element_callback(&Element::Node(node));
220 222
                                 }
221 223
                             }
222 224
                             for node in group.dense_nodes() {
223
-                                if node_ids.contains(&node.id) {
225
+                                if node_ids.binary_search(&node.id).is_ok() {
224 226
                                     // ID found, return dense node
225 227
                                     element_callback(&Element::DenseNode(node));
226 228
                                 }