summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2005-09-15 21:43:17 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-09-15 21:57:52 (GMT)
commit60ab26de9970ce829c95eb11ebb407fe95780148 (patch)
treedfed215bfc5ca6f409fb780465757ab70d64c30f
parentf71a69ab055c47056d0270b29b8f7455278c2422 (diff)
downloadgit-60ab26de9970ce829c95eb11ebb407fe95780148.zip
git-60ab26de9970ce829c95eb11ebb407fe95780148.tar.gz
git-60ab26de9970ce829c95eb11ebb407fe95780148.tar.bz2
[PATCH] Avoid wasting memory in git-rev-list
As pointed out on the list, git-rev-list can use a lot of memory. One low-hanging fruit is to free the commit buffer for commits that we parse. By default, parse_commit() will save away the buffer, since a lot of cases do want it, and re-reading it continually would be unnecessary. However, in many cases the buffer isn't actually necessary and saving it just wastes memory. We could just free the buffer ourselves, but especially in git-rev-list, we actually end up using the helper functions that automatically add parent commits to the commit lists, so we don't actually control the commit parsing directly. Instead, just make this behaviour of "parse_commit()" a global flag. Maybe this is a bit tasteless, but it's very simple, and it makes a noticable difference in memory usage. Before the change: [torvalds@g5 linux]$ /usr/bin/time git-rev-list v2.6.12..HEAD > /dev/null 0.26user 0.02system 0:00.28elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+3714minor)pagefaults 0swaps after the change: [torvalds@g5 linux]$ /usr/bin/time git-rev-list v2.6.12..HEAD > /dev/null 0.26user 0.00system 0:00.27elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+2433minor)pagefaults 0swaps note how the minor faults have decreased from 3714 pages to 2433 pages. That's all due to the fewer anonymous pages allocated to hold the comment buffers and their metadata. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--commit.c4
-rw-r--r--commit.h1
-rw-r--r--rev-list.c2
3 files changed, 6 insertions, 1 deletions
diff --git a/commit.c b/commit.c
index 2f73cf3..f735f98 100644
--- a/commit.c
+++ b/commit.c
@@ -3,6 +3,8 @@
#include "commit.h"
#include "cache.h"
+int save_commit_buffer = 1;
+
struct sort_node
{
/*
@@ -264,7 +266,7 @@ int parse_commit(struct commit *item)
sha1_to_hex(item->object.sha1));
}
ret = parse_commit_buffer(item, buffer, size);
- if (!ret) {
+ if (save_commit_buffer && !ret) {
item->buffer = buffer;
return 0;
}
diff --git a/commit.h b/commit.h
index 9dda2f0..30702ca 100644
--- a/commit.h
+++ b/commit.h
@@ -17,6 +17,7 @@ struct commit {
char *buffer;
};
+extern int save_commit_buffer;
extern const char *commit_type;
struct commit *lookup_commit(const unsigned char *sha1);
diff --git a/rev-list.c b/rev-list.c
index 2d97cdb..96aa342 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -582,6 +582,8 @@ int main(int argc, char **argv)
handle_one_commit(commit, &list);
}
+ save_commit_buffer = verbose_header;
+
if (!merge_order) {
sort_by_date(&list);
if (limited)