diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-02-16 14:45:13 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-02-16 14:45:13 -0800 |
commit | a3b3c9c916298199e4a80afccc2e14b69e5d6d42 (patch) | |
tree | 0df8d4998bd10174d612b09709772f0755d61cb8 /builtin | |
parent | 0078a7598518a66c085311a11a0f25203b9ecce6 (diff) | |
parent | 96f6d3f61ad02ef2fd0393765207233845a7c7e0 (diff) | |
download | git-a3b3c9c916298199e4a80afccc2e14b69e5d6d42.tar.gz git-a3b3c9c916298199e4a80afccc2e14b69e5d6d42.tar.xz |
Merge branch 'rs/ls-files-partial-optim'
"ls-files" run with pathspec has been micro-optimized to avoid
having to memmove(3) unnecessary bytes.
* rs/ls-files-partial-optim:
ls-files: move only kept cache entries in prune_cache()
ls-files: pass prefix length explicitly to prune_cache()
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/ls-files.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 159229081..1c0f057d0 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -369,28 +369,30 @@ static void show_files(struct dir_struct *dir) /* * Prune the index to only contain stuff starting with "prefix" */ -static void prune_cache(const char *prefix) +static void prune_cache(const char *prefix, size_t prefixlen) { - int pos = cache_name_pos(prefix, max_prefix_len); + int pos; unsigned int first, last; + if (!prefix) + return; + pos = cache_name_pos(prefix, prefixlen); if (pos < 0) pos = -pos-1; - memmove(active_cache, active_cache + pos, - (active_nr - pos) * sizeof(struct cache_entry *)); - active_nr -= pos; - first = 0; + first = pos; last = active_nr; while (last > first) { int next = (last + first) >> 1; const struct cache_entry *ce = active_cache[next]; - if (!strncmp(ce->name, prefix, max_prefix_len)) { + if (!strncmp(ce->name, prefix, prefixlen)) { first = next+1; continue; } last = next; } - active_nr = last; + memmove(active_cache, active_cache + pos, + (last - pos) * sizeof(struct cache_entry *)); + active_nr = last - pos; } /* @@ -641,8 +643,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) show_killed || show_modified || show_resolve_undo)) show_cached = 1; - if (max_prefix) - prune_cache(max_prefix); + prune_cache(max_prefix, max_prefix_len); if (with_tree) { /* * Basic sanity check; show-stages and show-unmerged |