mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
Fix "git commit directory/" performance anomaly
This trivial patch avoids re-hashing files that are already clean in the
index. This mirrors what commit 0781b8a9b2
did for "git add .", only for "git commit ." instead.
This improves the cold-cache case immensely, since we don't need to bring
in all the file contents, just the index and any files dirty in the index.
Before:
[torvalds@woody linux]$ time git commit .
real 1m49.537s
user 0m3.892s
sys 0m2.432s
After:
[torvalds@woody linux]$ time git commit .
real 0m14.273s
user 0m1.312s
sys 0m0.516s
(both after doing a "echo 3 > /proc/sys/vm/drop_caches" to get cold-cache
behaviour - even with the index optimization git still has to "lstat()"
all the files, so with a truly cold cache, bringing all the inodes in
will take some time).
[jc: trivial "return 0;" fixed]
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
af3785dc5a
commit
22631473e0
|
@ -86,9 +86,15 @@ static int process_lstat_error(const char *path, int err)
|
||||||
|
|
||||||
static int add_one_path(struct cache_entry *old, const char *path, int len, struct stat *st)
|
static int add_one_path(struct cache_entry *old, const char *path, int len, struct stat *st)
|
||||||
{
|
{
|
||||||
int option, size = cache_entry_size(len);
|
int option, size;
|
||||||
struct cache_entry *ce = xcalloc(1, size);
|
struct cache_entry *ce;
|
||||||
|
|
||||||
|
/* Was the old index entry already up-to-date? */
|
||||||
|
if (old && !ce_stage(old) && !ce_match_stat(old, st, 0))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
size = cache_entry_size(len);
|
||||||
|
ce = xcalloc(1, size);
|
||||||
memcpy(ce->name, path, len);
|
memcpy(ce->name, path, len);
|
||||||
ce->ce_flags = htons(len);
|
ce->ce_flags = htons(len);
|
||||||
fill_stat_cache_info(ce, st);
|
fill_stat_cache_info(ce, st);
|
||||||
|
|
Loading…
Reference in a new issue