void PrintResult()

in e2e-examples/gcs/benchmark/print_result.cc [96:173]


void PrintResult(const RunnerWatcher& watcher) {
  auto operations = watcher.GetNonWarmupsOperations();
  if (operations.empty()) {
    return;
  }

  auto elapsed_time = absl::ToDoubleSeconds(watcher.GetNonWarmupsDuration());

  // Total throughput

  int64_t total_bytes = 0;
  for (auto& op : operations) {
    total_bytes += op.bytes;
  }
  std::cout
      << absl::StrFormat(
             "Elapsed: %.1fs Count: %d Bytes: %.1fMB Throughput: %.2fMB/s",
             elapsed_time, operations.size(), total_bytes / kMB,
             total_bytes / kMB / elapsed_time)
      << std::endl;

  // Resource usage

  struct rusage ru;
  if (getrusage(RUSAGE_SELF, &ru) == 0) {
    std::cout << "Resource [ ";
    std::cout << absl::StrFormat(
        "utime: %.1fs ",
        absl::ToDoubleSeconds(absl::DurationFromTimeval(ru.ru_utime)));
    std::cout << absl::StrFormat(
        "stime: %.1fs ",
        absl::ToDoubleSeconds(absl::DurationFromTimeval(ru.ru_stime)));
    std::cout << absl::StrFormat("maxrss: %.2fMB ", ru.ru_maxrss / 1024.0);
    std::cout << "]" << std::endl;
  }

  // Percentile for each file

  std::cout << std::endl << "Operation percentiles" << std::endl;
  std::vector<size_t> indexes = GetSortedOperationIndex(operations);
  for (auto p : kSevenPercentiles) {
    size_t index = indexes[size_t(p * indexes.size())];
    auto op = operations[index];
    auto sec = absl::ToDoubleSeconds(op.elapsed_time);
    std::cout << absl::StrFormat(
                     " [p%04.1f] Throughput: %.2fMB/s Time: %.1fs, Chunks: %d "
                     "Peer: %s",
                     p * 100, op.bytes / sec / kMB, sec, op.chunks.size(),
                     op.peer)
              << std::endl;
  }

  // Percentile for each peer

  std::cout << std::endl << "Peer percentiles" << std::endl;
  std::vector<PeerValue> peers = GetSortedPeers(operations);
  for (auto p : kSevenPercentiles) {
    const PeerValue& peer = peers[size_t(p * peers.size())];
    auto indexes = peer.indexes;
    // Sorted by throughput in an ascending order
    std::sort(indexes.begin(), indexes.end(),
              [&operations](size_t a, size_t b) {
                return operations[a].elapsed_time > operations[b].elapsed_time;
              });
    std::vector<double> subt;
    for (auto p2 : kSevenPercentiles) {
      size_t index = indexes[indexes.size() * p2];
      auto op = operations[index];
      subt.push_back(op.bytes / absl::ToDoubleSeconds(op.elapsed_time));
    }
    std::cout << absl::StrFormat(
                     " [p%04.1f] Throughput: %.2fMB/s (p01:%.1f p50:%.1f "
                     "p99:%.1f) Count: %d Peer: %s",
                     p * 100, peer.throughput / kMB, subt[0] / kMB,
                     subt[2] / kMB, subt[4] / kMB, peer.total_count, peer.peer)
              << std::endl;
  }
}