Skip to content

Commit

Permalink
test-date: add a subcommand to measure times in shell scripts
Browse files Browse the repository at this point in the history
In the next commit, we want to teach Git's test suite to optionally
output test results in JUnit-style .xml files. These files contain
information about the time spent. So we need a way to measure time.

While we could use `date +%s` for that, this will give us only seconds,
i.e. very coarse-grained timings.

GNU `date` supports `date +%s.%N` (i.e. nanosecond-precision output),
but there is no equivalent in BSD `date` (read: on macOS, we would not
be able to obtain precise timings).

So let's introduce `test-tool date getnanos`, with an optional start
time, that outputs preciser values. Note that this might not actually
give us nanosecond precision on some platforms, but it will give us as
precise information as possible, without the portability issues of shell
commands.

Granted, it is a bit pointless to try measuring times accurately in
shell scripts, certainly to nanosecond precision. But it is better than
second-granularity.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
dscho authored and gitster committed Jan 28, 2019
1 parent 4b060a4 commit 4419de9
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions t/helper/test-date.c
Expand Up @@ -7,6 +7,7 @@ static const char *usage_msg = "\n"
" test-tool date parse [date]...\n"
" test-tool date approxidate [date]...\n"
" test-tool date timestamp [date]...\n"
" test-tool date getnanos [start-nanos]\n"
" test-tool date is64bit\n"
" test-tool date time_t-is64bit\n";

Expand Down Expand Up @@ -82,6 +83,15 @@ static void parse_approx_timestamp(const char **argv, struct timeval *now)
}
}

static void getnanos(const char **argv, struct timeval *now)
{
double seconds = getnanotime() / 1.0e9;

if (*argv)
seconds -= strtod(*argv, NULL);
printf("%lf\n", seconds);
}

int cmd__date(int argc, const char **argv)
{
struct timeval now;
Expand All @@ -108,6 +118,8 @@ int cmd__date(int argc, const char **argv)
parse_approxidate(argv+1, &now);
else if (!strcmp(*argv, "timestamp"))
parse_approx_timestamp(argv+1, &now);
else if (!strcmp(*argv, "getnanos"))
getnanos(argv+1, &now);
else if (!strcmp(*argv, "is64bit"))
return sizeof(timestamp_t) == 8 ? 0 : 1;
else if (!strcmp(*argv, "time_t-is64bit"))
Expand Down

0 comments on commit 4419de9

Please sign in to comment.