зеркало из https://github.com/microsoft/git.git
update-index/diff-index: use core.preloadindex to improve performance
'update-index --refresh' and 'diff-index' (without --cached) don't honor the core.preloadindex setting yet. Porcelain commands using these (such as git [svn] rebase) suffer from this, especially on Windows. Use read_cache_preload to improve performance. Additionally, in builtin/diff.c, don't preload index status if we don't access the working copy (--cached). Results with msysgit on WebKit repo (2GB in 200k files): | update-index | diff-index | rebase ----------------+--------------+------------+--------- msysgit-v1.8.0 | 9.157s | 10.536s | 42.791s + preloadindex | 9.157s | 10.536s | 28.725s + this patch | 2.329s | 2.752s | 15.152s + fscache [1] | 0.731s | 1.171s | 8.877s [1] https://github.com/kblees/git/tree/kb/fscache-v3 Thanks-to: Albert Krawczyk <pro-logic@optusnet.com.au> Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Jeff King <peff@peff.net>
This commit is contained in:
Родитель
7e2010537e
Коммит
7349afd20e
|
@ -41,9 +41,13 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
|
||||||
if (rev.pending.nr != 1 ||
|
if (rev.pending.nr != 1 ||
|
||||||
rev.max_count != -1 || rev.min_age != -1 || rev.max_age != -1)
|
rev.max_count != -1 || rev.min_age != -1 || rev.max_age != -1)
|
||||||
usage(diff_cache_usage);
|
usage(diff_cache_usage);
|
||||||
if (!cached)
|
if (!cached) {
|
||||||
setup_work_tree();
|
setup_work_tree();
|
||||||
if (read_cache() < 0) {
|
if (read_cache_preload(rev.diffopt.pathspec.raw) < 0) {
|
||||||
|
perror("read_cache_preload");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (read_cache() < 0) {
|
||||||
perror("read_cache");
|
perror("read_cache");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,8 +130,6 @@ static int builtin_diff_index(struct rev_info *revs,
|
||||||
usage(builtin_diff_usage);
|
usage(builtin_diff_usage);
|
||||||
argv++; argc--;
|
argv++; argc--;
|
||||||
}
|
}
|
||||||
if (!cached)
|
|
||||||
setup_work_tree();
|
|
||||||
/*
|
/*
|
||||||
* Make sure there is one revision (i.e. pending object),
|
* Make sure there is one revision (i.e. pending object),
|
||||||
* and there is no revision filtering parameters.
|
* and there is no revision filtering parameters.
|
||||||
|
@ -140,8 +138,14 @@ static int builtin_diff_index(struct rev_info *revs,
|
||||||
revs->max_count != -1 || revs->min_age != -1 ||
|
revs->max_count != -1 || revs->min_age != -1 ||
|
||||||
revs->max_age != -1)
|
revs->max_age != -1)
|
||||||
usage(builtin_diff_usage);
|
usage(builtin_diff_usage);
|
||||||
if (read_cache_preload(revs->diffopt.pathspec.raw) < 0) {
|
if (!cached) {
|
||||||
perror("read_cache_preload");
|
setup_work_tree();
|
||||||
|
if (read_cache_preload(revs->diffopt.pathspec.raw) < 0) {
|
||||||
|
perror("read_cache_preload");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (read_cache() < 0) {
|
||||||
|
perror("read_cache");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return run_diff_index(revs, cached);
|
return run_diff_index(revs, cached);
|
||||||
|
|
|
@ -593,6 +593,7 @@ struct refresh_params {
|
||||||
static int refresh(struct refresh_params *o, unsigned int flag)
|
static int refresh(struct refresh_params *o, unsigned int flag)
|
||||||
{
|
{
|
||||||
setup_work_tree();
|
setup_work_tree();
|
||||||
|
read_cache_preload(NULL);
|
||||||
*o->has_errors |= refresh_cache(o->flags | flag);
|
*o->has_errors |= refresh_cache(o->flags | flag);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче