Răsfoiți Sursa

replace modulo with if to check for wraparound in hashmap

Integer division is slow, and this improves the speed of all operations on the hashmap.

Benchmarked this patch on the rciorba/master-bench branch:
https://cdn.rawgit.com/rciorba/e3eded290e91a361f74eefdbc84416bb/raw/9e5d61e03c5842712d629e3e5567da3a512f1d79/results.html
Radu Ciorba 7 ani în urmă
părinte
comite
12e0f55991
1 a modificat fișierele cu 8 adăugiri și 2 ștergeri
  1. 8 2
      src/borg/_hashindex.c

+ 8 - 2
src/borg/_hashindex.c

@@ -146,7 +146,10 @@ hashindex_lookup(HashIndex *index, const void *key, int *start_idx)
             }
             }
             return idx;
             return idx;
         }
         }
-        idx = (idx + 1) % index->num_buckets;
+        idx++;
+        if (idx >= index->num_buckets) {
+            idx -= index->num_buckets;
+        }
         if(idx == start) {
         if(idx == start) {
             break;
             break;
         }
         }
@@ -547,7 +550,10 @@ hashindex_set(HashIndex *index, const void *key, const void *value)
         }
         }
         idx = start_idx;
         idx = start_idx;
         while(!BUCKET_IS_EMPTY(index, idx) && !BUCKET_IS_DELETED(index, idx)) {
         while(!BUCKET_IS_EMPTY(index, idx) && !BUCKET_IS_DELETED(index, idx)) {
-            idx = (idx + 1) % index->num_buckets;
+            idx++;
+            if (idx >= index->num_buckets){
+                idx -= index->num_buckets;
+            }
         }
         }
         if(BUCKET_IS_EMPTY(index, idx)){
         if(BUCKET_IS_EMPTY(index, idx)){
             index->num_empty--;
             index->num_empty--;