dd: use correct multiplication factor and simplify code

function                                             old     new   delta
dd_output_status                                     332     364     +32

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-10-14 17:43:41 +02:00
parent 04bb6b6a5a
commit 7eabffafa5

View File

@ -49,9 +49,9 @@ struct globals {
static void dd_output_status(int UNUSED_PARAM cur_signal) static void dd_output_status(int UNUSED_PARAM cur_signal)
{ {
#if ENABLE_FEATURE_DD_THIRD_STATUS_LINE #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE
unsigned long long total; double seconds;
unsigned long long diff_scaled; unsigned long long bytes_sec;
unsigned long long diff_us = monotonic_us(); /* before fprintf */ unsigned long long now_us = monotonic_us(); /* before fprintf */
#endif #endif
/* Deliberately using %u, not %d */ /* Deliberately using %u, not %d */
@ -72,24 +72,12 @@ static void dd_output_status(int UNUSED_PARAM cur_signal)
* (echo DONE) | ./busybox dd >/dev/null * (echo DONE) | ./busybox dd >/dev/null
* (sleep 1; echo DONE) | ./busybox dd >/dev/null * (sleep 1; echo DONE) | ./busybox dd >/dev/null
*/ */
diff_us -= G.begin_time_us; seconds = (now_us - G.begin_time_us) / 1000000.0;
/* We need to calculate "(total * 1000000) / usec" without overflow. bytes_sec = G.total_bytes / seconds;
* this would work too, but is bigger than integer code below.
* total = G.total_bytes * (double)1000000 / (diff_us ? diff_us : 1);
*/
diff_scaled = diff_us;
total = G.total_bytes;
while (total > MAXINT(unsigned long long) / (1024 * 1024)) {
total >>= 1;
diff_scaled >>= 1;
}
total *= (1024 * 1024); /* should be 1000000, but it's +45 bytes */
if (diff_scaled > 1)
total /= diff_scaled;
fprintf(stderr, "%f seconds, %sB/s\n", fprintf(stderr, "%f seconds, %sB/s\n",
diff_us / 1000000.0, seconds,
/* show fractional digit, use suffixes */ /* show fractional digit, use suffixes */
make_human_readable_str(total, 1, 0) make_human_readable_str(bytes_sec, 1, 0)
); );
#endif #endif
} }