dd: use correct multiplication factor and simplify code
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 14 Oct 2009 15:43:41 +0000 (17:43 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 14 Oct 2009 15:43:41 +0000 (17:43 +0200)
function                                             old     new   delta
dd_output_status                                     332     364     +32

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/dd.c

index f2e1a1683b0c47a71ab3fbcbd8a719d870eb4b3c..8bba62ce12a522b1d41c2e288ff4166cb0cb0512 100644 (file)
@@ -49,9 +49,9 @@ struct globals {
 static void dd_output_status(int UNUSED_PARAM cur_signal)
 {
 #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE
-       unsigned long long total;
-       unsigned long long diff_scaled;
-       unsigned long long diff_us = monotonic_us(); /* before fprintf */
+       double seconds;
+       unsigned long long bytes_sec;
+       unsigned long long now_us = monotonic_us(); /* before fprintf */
 #endif
 
        /* 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
         * (sleep 1; echo DONE) | ./busybox dd >/dev/null
         */
-       diff_us -= G.begin_time_us;
-       /* We need to calculate "(total * 1000000) / usec" without overflow.
-        * 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;
+       seconds = (now_us - G.begin_time_us) / 1000000.0;
+       bytes_sec = G.total_bytes / seconds;
        fprintf(stderr, "%f seconds, %sB/s\n",
-                       diff_us / 1000000.0,
+                       seconds,
                        /* show fractional digit, use suffixes */
-                       make_human_readable_str(total, 1, 0)
+                       make_human_readable_str(bytes_sec, 1, 0)
        );
 #endif
 }