Merge branch 'jc/cat-file-batch-default-format-optim'

Optimize away strbuf_expand() call with a hardcoded formatting logic
specific for the default format in the --batch and --batch-check
options of "git cat-file".

* jc/cat-file-batch-default-format-optim:
  cat-file: skip expanding default format
This commit is contained in:
Junio C Hamano 2022-03-23 14:09:31 -07:00
commit 889860e1ad
2 changed files with 35 additions and 6 deletions

View file

@ -360,6 +360,13 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d
}
}
static void print_default_format(struct strbuf *scratch, struct expand_data *data)
{
strbuf_addf(scratch, "%s %s %"PRIuMAX"\n", oid_to_hex(&data->oid),
type_name(data->type),
(uintmax_t)data->size);
}
/*
* If "pack" is non-NULL, then "offset" is the byte offset within the pack from
* which the object may be accessed (though note that we may also rely on
@ -391,8 +398,14 @@ static void batch_object_write(const char *obj_name,
}
strbuf_reset(scratch);
strbuf_expand(scratch, opt->format, expand_format, data);
strbuf_addch(scratch, '\n');
if (!opt->format) {
print_default_format(scratch, data);
} else {
strbuf_expand(scratch, opt->format, expand_format, data);
strbuf_addch(scratch, '\n');
}
batch_write(opt, scratch->buf, scratch->len);
if (opt->batch_mode == BATCH_MODE_CONTENTS) {
@ -646,6 +659,8 @@ static void batch_objects_command(struct batch_options *opt,
strbuf_release(&input);
}
#define DEFAULT_FORMAT "%(objectname) %(objecttype) %(objectsize)"
static int batch_objects(struct batch_options *opt)
{
struct strbuf input = STRBUF_INIT;
@ -654,9 +669,6 @@ static int batch_objects(struct batch_options *opt)
int save_warning;
int retval = 0;
if (!opt->format)
opt->format = "%(objectname) %(objecttype) %(objectsize)";
/*
* Expand once with our special mark_query flag, which will prime the
* object_info to be handed to oid_object_info_extended for each
@ -664,12 +676,17 @@ static int batch_objects(struct batch_options *opt)
*/
memset(&data, 0, sizeof(data));
data.mark_query = 1;
strbuf_expand(&output, opt->format, expand_format, &data);
strbuf_expand(&output,
opt->format ? opt->format : DEFAULT_FORMAT,
expand_format,
&data);
data.mark_query = 0;
strbuf_release(&output);
if (opt->transform_mode)
data.split_on_whitespace = 1;
if (opt->format && !strcmp(opt->format, DEFAULT_FORMAT))
opt->format = NULL;
/*
* If we are printing out the object, then always fill in the type,
* since we will want to decide whether or not to stream.

12
t/perf/p1006-cat-file.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/sh
test_description='Tests listing object info performance'
. ./perf-lib.sh
test_perf_large_repo
test_perf 'cat-file --batch-check' '
git cat-file --batch-all-objects --batch-check
'
test_done