summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 5ee2ad6)
raw | patch | inline | side by side (parent: 5ee2ad6)
author | Linus Torvalds <torvalds@osdl.org> | |
Sat, 11 Feb 2006 18:43:56 +0000 (10:43 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Sun, 12 Feb 2006 00:49:52 +0000 (16:49 -0800) |
Average it out over a few events to make the numbers stable, and fix the
silly usec->binary-ms conversion.
Yeah, yeah, it's arguably eye-candy to keep the user calm, but let's do
that right.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
silly usec->binary-ms conversion.
Yeah, yeah, it's arguably eye-candy to keep the user calm, but let's do
that right.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
fetch-clone.c | patch | blob | history |
diff --git a/fetch-clone.c b/fetch-clone.c
index b67d9764978cc5758612884e2a906237d349795e..873312df3d7ee28f847dfa5886a603981dcce8c2 100644 (file)
--- a/fetch-clone.c
+++ b/fetch-clone.c
die("git-unpack-objects died of unnatural causes %d", status);
}
+/*
+ * We average out the download speed over this many "events", where
+ * an event is a minimum of about half a second. That way, we get
+ * a reasonably stable number.
+ */
+#define NR_AVERAGE (4)
+
+/*
+ * A "binary msec" is a power-of-two-msec, aka 1/1024th of a second.
+ * Keeing the time in that format means that "bytes / msecs" means
+ * is the same as kB/s (modulo rounding).
+ *
+ * 1000512 is a magic number (usecs in a second, rounded up by half
+ * of 1024, to make "rounding" come out right ;)
+ */
+#define usec_to_binarymsec(x) ((int)(x) / (1000512 >> 10))
+
int receive_keep_pack(int fd[2], const char *me, int quiet)
{
char tmpfile[PATH_MAX];
int ofd, ifd;
unsigned long total;
static struct timeval prev_tv;
+ struct average {
+ unsigned long bytes;
+ unsigned long time;
+ } download[NR_AVERAGE] = { {0, 0}, };
+ unsigned long avg_bytes, avg_time;
+ int idx = 0;
ifd = fd[0];
snprintf(tmpfile, sizeof(tmpfile),
gettimeofday(&prev_tv, NULL);
total = 0;
+ avg_bytes = 0;
+ avg_time = 0;
while (1) {
char buf[8192];
ssize_t sz, wsz, pos;
gettimeofday(&tv, NULL);
msecs = tv.tv_sec - prev_tv.tv_sec;
msecs <<= 10;
- msecs += (int)(tv.tv_usec - prev_tv.tv_usec) >> 10;
+ msecs += usec_to_binarymsec(tv.tv_usec - prev_tv.tv_usec);
+
if (msecs > 500) {
prev_tv = tv;
last = total;
- fprintf(stderr, "%4lu.%03luMB (%lu kB/s) \r",
+
+ /* Update averages ..*/
+ avg_bytes += diff;
+ avg_time += msecs;
+ avg_bytes -= download[idx].bytes;
+ avg_time -= download[idx].time;
+ download[idx].bytes = diff;
+ download[idx].time = msecs;
+ idx++;
+ if (idx >= NR_AVERAGE)
+ idx = 0;
+
+ fprintf(stderr, "%4lu.%03luMB (%lu kB/s) \r",
total >> 20,
1000*((total >> 10) & 1023)>>10,
- diff / msecs );
+ avg_bytes / avg_time );
}
}
}