summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2015-01-16 13:11:25 -0800
committerElliott Hughes <enh@google.com>2015-01-16 13:11:25 -0800
commit8bb020e8e58be2b0013f6d4ac0a24981cba38092 (patch)
tree50435a27afdb960a3ceb5dabdef4b3a97296208e
parentffad8df672363bad43528898cc47aa2ed3d08c66 (diff)
downloadbionic-8bb020e8e58be2b0013f6d4ac0a24981cba38092.zip
bionic-8bb020e8e58be2b0013f6d4ac0a24981cba38092.tar.gz
bionic-8bb020e8e58be2b0013f6d4ac0a24981cba38092.tar.bz2
Use SI prefixes throughout the benchmark output.
Also switch throughput to GiB/s. I did play with using the new code, but having consistent units for all results seemed easier to use anyway (and doesn't require extra code). Change-Id: I466fd573373bd05619e6f6e6d3dedd7dae0d9362
-rw-r--r--benchmarks/benchmark_main.cpp57
1 files changed, 45 insertions, 12 deletions
diff --git a/benchmarks/benchmark_main.cpp b/benchmarks/benchmark_main.cpp
index 6d83f8a..fae09be 100644
--- a/benchmarks/benchmark_main.cpp
+++ b/benchmarks/benchmark_main.cpp
@@ -22,7 +22,7 @@
#include <time.h>
#include <string>
-#include <map>
+#include <vector>
#include <inttypes.h>
@@ -38,6 +38,41 @@ static BenchmarkList& Benchmarks() {
return benchmarks;
}
+// Similar to the code in art, but supporting both binary and decimal prefixes.
+static std::string PrettyInt(uint64_t count, size_t base) {
+ if (base != 2 && base != 10) abort();
+
+ // The byte thresholds at which we display amounts. A count is displayed
+ // in unit U when kUnitThresholds[U] <= bytes < kUnitThresholds[U+1].
+ static const uint64_t kUnitThresholds2[] = {
+ 1024*1024*1024 /* Gi */, 2*1024*1024 /* Mi */, 3*1024 /* Ki */, 0,
+ };
+ static const uint64_t kUnitThresholds10[] = {
+ 1000*1000*1000 /* G */, 2*1000*1000 /* M */, 3*1000 /* k */, 0,
+ };
+ static const uint64_t kAmountPerUnit2[] = { 1024*1024*1024, 1024*1024, 1024, 1 };
+ static const uint64_t kAmountPerUnit10[] = { 1000*1000*1000, 1000*1000, 1000, 1 };
+ static const char* const kUnitStrings2[] = { "Gi", "Mi", "Ki", "" };
+ static const char* const kUnitStrings10[] = { "G", "M", "k", "" };
+
+ // Which set are we using?
+ const uint64_t* kUnitThresholds = ((base == 2) ? kUnitThresholds2 : kUnitThresholds10);
+ const uint64_t* kAmountPerUnit = ((base == 2) ? kAmountPerUnit2 : kAmountPerUnit10);
+ const char* const* kUnitStrings = ((base == 2) ? kUnitStrings2 : kUnitStrings10);
+
+ size_t i = 0;
+ for (; kUnitThresholds[i] != 0; ++i) {
+ if (count >= kUnitThresholds[i]) {
+ break;
+ }
+ }
+ char* s = NULL;
+ asprintf(&s, "%" PRId64 "%s", count / kAmountPerUnit[i], kUnitStrings[i]);
+ std::string result(s);
+ free(s);
+ return result;
+}
+
static int Round(int n) {
int base = 1;
while (base*10 < n) {
@@ -154,27 +189,25 @@ void Benchmark::RunWithArg(int arg) {
char throughput[100];
throughput[0] = '\0';
+
if (g_benchmark_total_time_ns > 0 && g_bytes_processed > 0) {
- double mib_processed = static_cast<double>(g_bytes_processed)/1e6;
+ double gib_processed = static_cast<double>(g_bytes_processed)/1e9;
double seconds = static_cast<double>(g_benchmark_total_time_ns)/1e9;
- snprintf(throughput, sizeof(throughput), " %8.2f MiB/s", mib_processed/seconds);
+ snprintf(throughput, sizeof(throughput), " %8.3f GiB/s", gib_processed/seconds);
}
char full_name[100];
if (fn_range_ != NULL) {
- if (arg >= (1<<20)) {
- snprintf(full_name, sizeof(full_name), "%s/%dM", name_, arg/(1<<20));
- } else if (arg >= (1<<10)) {
- snprintf(full_name, sizeof(full_name), "%s/%dK", name_, arg/(1<<10));
- } else {
- snprintf(full_name, sizeof(full_name), "%s/%d", name_, arg);
- }
+ snprintf(full_name, sizeof(full_name), "%s/%s", name_, PrettyInt(arg, 2).c_str());
} else {
snprintf(full_name, sizeof(full_name), "%s", name_);
}
- printf("%-*s %10d %10" PRId64 "%s\n", g_name_column_width, full_name,
- iterations, g_benchmark_total_time_ns/iterations, throughput);
+ printf("%-*s %10s %10" PRId64 "%s\n",
+ g_name_column_width, full_name,
+ PrettyInt(iterations, 10).c_str(),
+ g_benchmark_total_time_ns/iterations,
+ throughput);
fflush(stdout);
}