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 * 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 * 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_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); batch_write(opt, scratch->buf, scratch->len);
if (opt->batch_mode == BATCH_MODE_CONTENTS) { if (opt->batch_mode == BATCH_MODE_CONTENTS) {
@ -646,6 +659,8 @@ static void batch_objects_command(struct batch_options *opt,
strbuf_release(&input); strbuf_release(&input);
} }
#define DEFAULT_FORMAT "%(objectname) %(objecttype) %(objectsize)"
static int batch_objects(struct batch_options *opt) static int batch_objects(struct batch_options *opt)
{ {
struct strbuf input = STRBUF_INIT; struct strbuf input = STRBUF_INIT;
@ -654,9 +669,6 @@ static int batch_objects(struct batch_options *opt)
int save_warning; int save_warning;
int retval = 0; int retval = 0;
if (!opt->format)
opt->format = "%(objectname) %(objecttype) %(objectsize)";
/* /*
* Expand once with our special mark_query flag, which will prime the * Expand once with our special mark_query flag, which will prime the
* object_info to be handed to oid_object_info_extended for each * 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)); memset(&data, 0, sizeof(data));
data.mark_query = 1; 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; data.mark_query = 0;
strbuf_release(&output); strbuf_release(&output);
if (opt->transform_mode) if (opt->transform_mode)
data.split_on_whitespace = 1; 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, * If we are printing out the object, then always fill in the type,
* since we will want to decide whether or not to stream. * 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