We do a linear search for in_pack index in create_object_entry(). This
function is called for every available object in the worst case (and
on linux-2.6.git, that's about 6.5M). Try to avoid that by saving the
index in packed_git. Since we should not have zillions of packs, this
extra space should not be a big deal.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 builtin/pack-objects.c | 11 ++---------
 cache.h                |  1 +
 2 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index d0d371714a..1fdb85ebb5 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1074,15 +1074,7 @@ static void create_object_entry(const struct object_id 
*oid,
        else
                nr_result++;
        if (found_pack) {
-               int i;
-
-               for (i = 0; i < (1 << OE_IN_PACK_BITS); i++)
-                       if (to_pack.in_pack[i] == found_pack) {
-                               entry->in_pack_idx = i;
-                               break;
-                       }
-               if (i == (1 << OE_IN_PACK_BITS))
-                       die("BUG: pack not found!");
+               entry->in_pack_idx = found_pack->index;
                entry->in_pack_offset = found_offset;
        }
 
@@ -2980,6 +2972,7 @@ static void init_in_pack_mapping(struct packing_data 
*to_pack)
                if (i >= (1 << OE_IN_PACK_BITS))
                        die("BUG: too many packs to handle!");
                to_pack->in_pack[i] = p;
+               p->index = i;
        }
 }
 
diff --git a/cache.h b/cache.h
index 862bdff83a..b90feb3802 100644
--- a/cache.h
+++ b/cache.h
@@ -1635,6 +1635,7 @@ extern struct packed_git {
        int index_version;
        time_t mtime;
        int pack_fd;
+       int index;              /* for builtin/pack-objects.c */
        unsigned pack_local:1,
                 pack_keep:1,
                 freshened:1,
-- 
2.16.1.435.g8f24da2e1a

Reply via email to