]> source.dussan.org Git - tigervnc.git/commitdiff
Shorten stats from EncodeManager using SI/IEC prefixes
authorPierre Ossman <ossman@cendio.se>
Tue, 3 Mar 2015 15:30:13 +0000 (16:30 +0100)
committerPierre Ossman <ossman@cendio.se>
Tue, 3 Mar 2015 15:30:13 +0000 (16:30 +0100)
Also avoids %lld which isn't supported on Windows.

common/rfb/EncodeManager.cxx
common/rfb/util.cxx
common/rfb/util.h

index 954f29b1b8b5b7516af888bbfd9205042d8b25ba..9122cd75a36ddcc0156e64e28ec923c86afb7df1 100644 (file)
@@ -163,6 +163,8 @@ void EncodeManager::logStats()
 
   double ratio;
 
+  char a[1024], b[1024];
+
   rects = 0;
   pixels = bytes = equivalent = 0;
 
@@ -190,19 +192,23 @@ void EncodeManager::logStats()
 
       ratio = (double)stats[i][j].equivalent / stats[i][j].bytes;
 
-      vlog.info("    %s: %u rects, %llu pixels",
-                encoderTypeName((EncoderType)j),
-                stats[i][j].rects, stats[i][j].pixels);
-      vlog.info("    %*s  %llu bytes (%g ratio)",
-                strlen(encoderTypeName((EncoderType)j)), "",
-                stats[i][j].bytes, ratio);
+      siPrefix(stats[i][j].rects, "rects", a, sizeof(a));
+      siPrefix(stats[i][j].pixels, "pixels", b, sizeof(b));
+      vlog.info("    %s: %s, %s", encoderTypeName((EncoderType)j), a, b);
+      iecPrefix(stats[i][j].bytes, "B", a, sizeof(a));
+      vlog.info("    %*s  %s (1:%g ratio)",
+                (int)strlen(encoderTypeName((EncoderType)j)), "",
+                a, ratio);
     }
   }
 
   ratio = (double)equivalent / bytes;
 
-  vlog.info("  Total: %u rects, %llu pixels", rects, pixels);
-  vlog.info("         %llu bytes (%g ratio)", bytes, ratio);
+  siPrefix(rects, "rects", a, sizeof(a));
+  siPrefix(pixels, "pixels", b, sizeof(b));
+  vlog.info("  Total: %s, %s", a, b);
+  iecPrefix(bytes, "B", a, sizeof(a));
+  vlog.info("         %s (1:%g ratio)", a, ratio);
 }
 
 bool EncodeManager::supported(int encoding)
index a41ad96a8a1c88f4aa89379c36c588014509d5ef..2b3c9f40f4efbfb05e6ae470a5aeaa35b1765d7e 100644 (file)
@@ -34,6 +34,7 @@
 #include <config.h>
 #endif
 
+#include <stdio.h>
 #include <sys/time.h>
 
 #include <rfb/util.h>
@@ -110,4 +111,44 @@ namespace rfb {
 
     return diff;
   }
+
+  static size_t doPrefix(long long value, const char *unit,
+                         char *buffer, size_t maxlen,
+                         unsigned divisor, const char **prefixes,
+                         size_t prefixCount) {
+    double newValue;
+    size_t prefix, len;
+
+    newValue = value;
+    prefix = 0;
+    while (newValue >= divisor) {
+      if (prefix >= prefixCount)
+        break;
+      newValue /= divisor;
+      prefix++;
+    }
+
+    len = snprintf(buffer, maxlen, "%g %s%s", newValue,
+                   (prefix == 0) ? "" : prefixes[prefix-1], unit);
+    buffer[maxlen-1] = '\0';
+
+    return len;
+  }
+
+  static const char *siPrefixes[] =
+    { "k", "M", "G", "T", "P", "E", "Z", "Y" };
+  static const char *iecPrefixes[] =
+    { "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi" };
+
+  size_t siPrefix(long long value, const char *unit,
+                  char *buffer, size_t maxlen) {
+    return doPrefix(value, unit, buffer, maxlen, 1000, siPrefixes,
+                    sizeof(siPrefixes)/sizeof(*siPrefixes));
+  }
+
+  size_t iecPrefix(long long value, const char *unit,
+                   char *buffer, size_t maxlen) {
+    return doPrefix(value, unit, buffer, maxlen, 1024, iecPrefixes,
+                    sizeof(iecPrefixes)/sizeof(*iecPrefixes));
+  }
 };
index 13dbe68ece779fcc108323d5f74e3425fc47562e..98ce64200fe7b5d495dbc85c275267d70cb337cf 100644 (file)
@@ -90,6 +90,11 @@ namespace rfb {
 
   // Returns time elapsed since given moment in milliseconds.
   unsigned msSince(const struct timeval *then);
+
+  size_t siPrefix(long long value, const char *unit,
+                  char *buffer, size_t maxlen);
+  size_t iecPrefix(long long value, const char *unit,
+                   char *buffer, size_t maxlen);
 }
 
 // Some platforms (e.g. Windows) include max() and min() macros in their