summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 5b766ea)
raw | patch | inline | side by side (parent: 5b766ea)
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | |
Sun, 12 Feb 2006 01:57:57 +0000 (02:57 +0100) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Sun, 12 Feb 2006 13:12:39 +0000 (05:12 -0800) |
In a simple test, this brings down the CPU time from 47 sec to 22 sec.
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
fsck-objects.c | patch | blob | history | |
name-rev.c | patch | blob | history | |
object.c | patch | blob | history | |
object.h | patch | blob | history |
diff --git a/fsck-objects.c b/fsck-objects.c
index 9950be264501a5c99eafe7c2438b27b857ba6402..6439d55126a615c04db1be16ebcaf8b0af9f7ae3 100644 (file)
--- a/fsck-objects.c
+++ b/fsck-objects.c
int i;
/* Look up all the requirements, warn about missing objects.. */
- for (i = 0; i < nr_objs; i++) {
+ for (i = 0; i < obj_allocs; i++) {
struct object *obj = objs[i];
+ if (!obj)
+ continue;
+
if (!obj->parsed) {
if (!standalone && has_sha1_file(obj->sha1))
; /* it is in pack */
diff --git a/name-rev.c b/name-rev.c
index bbadb91aa0f51fe1ef7135866912d806c70fc457..0c3f547622245a2bc8984498289e86f89f87c362 100644 (file)
--- a/name-rev.c
+++ b/name-rev.c
} else if (all) {
int i;
- for (i = 0; i < nr_objs; i++)
- printf("%s %s\n", sha1_to_hex(objs[i]->sha1),
- get_rev_name(objs[i]));
+ for (i = 0; i < obj_allocs; i++)
+ if (objs[i])
+ printf("%s %s\n", sha1_to_hex(objs[i]->sha1),
+ get_rev_name(objs[i]));
} else
for ( ; revs; revs = revs->next)
printf("%s %s\n", revs->name, get_rev_name(revs->item));
diff --git a/object.c b/object.c
index 1577f74281be776082fecebdf8947bcb8c7c6802..3259862ab2eeeb3adcd52c24c801fd4d4e3212b7 100644 (file)
--- a/object.c
+++ b/object.c
#include "tag.h"
struct object **objs;
-int nr_objs;
-static int obj_allocs;
+static int nr_objs;
+int obj_allocs;
int track_object_refs = 1;
+static int hashtable_index(const unsigned char *sha1)
+{
+ unsigned int i = *(unsigned int *)sha1;
+ return (int)(i % obj_allocs);
+}
+
static int find_object(const unsigned char *sha1)
{
- int first = 0, last = nr_objs;
-
- while (first < last) {
- int next = (first + last) / 2;
- struct object *obj = objs[next];
- int cmp;
-
- cmp = memcmp(sha1, obj->sha1, 20);
- if (!cmp)
- return next;
- if (cmp < 0) {
- last = next;
- continue;
- }
- first = next+1;
- }
- return -first-1;
+ int i = hashtable_index(sha1);
+
+ if (!objs)
+ return -1;
+
+ while (objs[i]) {
+ if (memcmp(sha1, objs[i]->sha1, 20) == 0)
+ return i;
+ i++;
+ if (i == obj_allocs)
+ i = 0;
+ }
+ return -1 - i;
}
struct object *lookup_object(const unsigned char *sha1)
void created_object(const unsigned char *sha1, struct object *obj)
{
- int pos = find_object(sha1);
+ int pos;
obj->parsed = 0;
memcpy(obj->sha1, sha1, 20);
obj->refs = NULL;
obj->used = 0;
- if (pos >= 0)
- die("Inserting %s twice\n", sha1_to_hex(sha1));
- pos = -pos-1;
-
- if (obj_allocs == nr_objs) {
- obj_allocs = alloc_nr(obj_allocs);
+ if (obj_allocs - 1 <= nr_objs * 2) {
+ int i, count = obj_allocs;
+ obj_allocs = (obj_allocs < 32 ? 32 : 2 * obj_allocs);
objs = xrealloc(objs, obj_allocs * sizeof(struct object *));
+ memset(objs + count, 0, (obj_allocs - count)
+ * sizeof(struct object *));
+ for (i = 0; i < count; i++)
+ if (objs[i]) {
+ int j = find_object(objs[i]->sha1);
+ if (j != i) {
+ j = -1 - j;
+ objs[j] = objs[i];
+ objs[i] = NULL;
+ }
+ }
}
- /* Insert it into the right place */
- memmove(objs + pos + 1, objs + pos, (nr_objs - pos) *
- sizeof(struct object *));
+ pos = find_object(sha1);
+ if (pos >= 0)
+ die("Inserting %s twice\n", sha1_to_hex(sha1));
+ pos = -pos-1;
objs[pos] = obj;
nr_objs++;
diff --git a/object.h b/object.h
index 0e7618283cb8c85d89cc2935b8ab7430571a14a7..e08afbd29ff04cf463a4aacdc4fe141a2ab54ce6 100644 (file)
--- a/object.h
+++ b/object.h
};
extern int track_object_refs;
-extern int nr_objs;
+extern int obj_allocs;
extern struct object **objs;
/** Internal only **/