Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[RFC] Millisecond and microsecond specifiers for TIMEFMT
- X-seq: zsh-workers 42113
- From: dana <dana@xxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: [RFC] Millisecond and microsecond specifiers for TIMEFMT
- Date: Mon, 11 Dec 2017 19:58:41 -0600
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dana-is.20150623.gappssmtp.com; s=20150623; h=from:content-transfer-encoding:mime-version:subject:message-id:date :to; bh=lq+if0JuPrH1XSfvkJ8yN5C8RnKiNFlQyhDypiju0D4=; b=z5i6BFmwqijp7uqikcjjWf5oyLThNtmOKw07e4sa5A48ra38T907Dsd42FB4+NrLCi gAuDUhnCKtG/7D2orNCR/kCmoHHwzXKLyRTZ3gbqbLW4IGJzePlm1j3PzKeEF/CUTQBX /kRiWA8v3lK2tuNyyHMbAXQcI4HocgPWa+ay140VI6dtROniBDd2y6QgEiod+K9k/A8F +CmV2CNRRDfPGJ7rXgzM6oHIkfOesbwO5smZVGN5wjJRYgQ248QVLcJ49ZQCMXdvetFf jWiVbeCIJbMCBm2U8TGuAzJ9+tuKeyn+j37nlrnrvrB/oTwIs4is0BpH2+pQBPwQSD3w 3a4Q==
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- List-unsubscribe: <mailto:zsh-workers-unsubscribe@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
Hey again.
I am often interested in getting sub-second-precision timing on shell commands,
but the `time` built-in doesn't offer this (not really, anyway). I can kind of
work around it by writing a function that fiddles with SECONDS, but my function
doesn't have the fancy syntax support that `time` has, which makes it
inconvenient for measuring some things.
What i'd really like is if TIMEFMT supported sequences for milliseconds and
microseconds.
I had a look and it really does seem quite simple to implement. How would you
feel about something like the change below?
The final result:
% Src/zsh -c 'TIMEFMT="%E %mE %uE"; time sleep 1.5'
1.51s 1505ms 1505010us
Issues i can think of:
* Obviously this ties up %m and %u; they can't be used for much else after this.
TIMEFMT sequences don't seem to change often, so i doubt that's a massive
problem, but there are other options ofc. Could make it an extension of the %*
feature, for example — so like %*mE / %*uE. Kind of weird, but it wouldn't
consume two extra characters at least. Another option might be some kind of
arbitrary multiplier digit like %*3E / %*6E. Open to ideas.
* Whatever new sequence is chosen, if anyone was relying on its previous
undefinedness to produce a literal, they will have to update their TIMEFMT
now. Oh well.
* There might be some loss of precision...? Not that worried about it though,
it's certainly close enough for my purposes.
* It would be nice if it could actually print µs instead of us, but i assume
that would lead down a rabbit hole of locale stuff that i don't really know
how to deal with in C.
dana
diff --git a/Src/jobs.c b/Src/jobs.c
index 226e7cff3..fc5bfacc6 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -728,6 +728,40 @@ printtime(struct timeval *real, child_times_t *ti, char *desc)
case 'S':
fprintf(stderr, "%4.2fs", system_time);
break;
+ case 'm':
+ switch (*++s) {
+ case 'E':
+ fprintf(stderr, "%0.fms", elapsed_time * 1000.0);
+ break;
+ case 'U':
+ fprintf(stderr, "%0.fms", user_time * 1000.0);
+ break;
+ case 'S':
+ fprintf(stderr, "%0.fms", system_time * 1000.0);
+ break;
+ default:
+ fprintf(stderr, "%%m");
+ s--;
+ break;
+ }
+ break;
+ case 'u':
+ switch (*++s) {
+ case 'E':
+ fprintf(stderr, "%0.fus", elapsed_time * 1000000.0);
+ break;
+ case 'U':
+ fprintf(stderr, "%0.fus", user_time * 1000000.0);
+ break;
+ case 'S':
+ fprintf(stderr, "%0.fus", system_time * 1000000.0);
+ break;
+ default:
+ fprintf(stderr, "%%u");
+ s--;
+ break;
+ }
+ break;
case '*':
switch (*++s) {
case 'E':
Messages sorted by:
Reverse Date,
Date,
Thread,
Author