102 lines
3.3 KiB
C++
102 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef TEST_TESTSUPPORT_PERF_RESULT_REPORTER_H_
|
|
#define TEST_TESTSUPPORT_PERF_RESULT_REPORTER_H_
|
|
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "api/array_view.h"
|
|
#include "test/testsupport/perf_test.h"
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
// These match the units in histogram.proto (in third_party/catapult).
|
|
enum class Unit {
|
|
kMs,
|
|
kMsBestFitFormat,
|
|
kMsTs,
|
|
kNPercent,
|
|
kSizeInBytes,
|
|
kBytesPerSecond,
|
|
kHertz,
|
|
kUnitless,
|
|
kCount,
|
|
kSigma,
|
|
};
|
|
|
|
struct MetricInfo {
|
|
Unit unit;
|
|
ImproveDirection improve_direction;
|
|
};
|
|
|
|
// A helper class for using the perf test printing functions safely, as
|
|
// otherwise it's easy to accidentally mix up arguments to produce usable but
|
|
// malformed perf data. See https://crbug.com/923564.
|
|
//
|
|
// Sample usage:
|
|
// auto reporter = PerfResultReporter("ramp_up_time", "bwe_15s");
|
|
// reporter.RegisterImportantMetric(
|
|
// "_turn_over_tcp", Unit::kMs, ImproveDirection::kBiggerIsBetter);
|
|
// reporter.RegisterImportantMetric("_cpu_time", Unit::kMs);
|
|
// ...
|
|
// reporter.AddResult("turn_over_tcp", GetTurnOverTcpTime());
|
|
// reporter.AddResult("turn_over_udp", GetTurnOverUdpTime());
|
|
//
|
|
// This will show in the dashboard as
|
|
// (test binary name) > (bot) > ramp_up_time_turn_over_tcp > bwe_15s.
|
|
// (test binary name) > (bot) > ramp_up_time_turn_over_udp > bwe_15s.
|
|
//
|
|
// If you add more reporters that cover other user stories, they will show up
|
|
// as separate subtests (e.g. next to bwe_15s).
|
|
class PerfResultReporter {
|
|
public:
|
|
PerfResultReporter(const std::string& metric_basename,
|
|
const std::string& story_name);
|
|
~PerfResultReporter();
|
|
|
|
void RegisterMetric(const std::string& metric_suffix, Unit unit);
|
|
void RegisterMetric(const std::string& metric_suffix,
|
|
Unit unit,
|
|
ImproveDirection improve_direction);
|
|
void AddResult(const std::string& metric_suffix, size_t value) const;
|
|
void AddResult(const std::string& metric_suffix, double value) const;
|
|
|
|
void AddResultList(const std::string& metric_suffix,
|
|
rtc::ArrayView<const double> values) const;
|
|
|
|
// Users should prefer AddResultList if possible, as otherwise the min/max
|
|
// values reported on the perf dashboard aren't useful.
|
|
// |mean_and_error| should be a comma-separated string of mean then
|
|
// error/stddev, e.g. "2.4,0.5".
|
|
void AddResultMeanAndError(const std::string& metric_suffix,
|
|
const double mean,
|
|
const double error);
|
|
|
|
// Returns the metric info if it has been registered.
|
|
absl::optional<MetricInfo> GetMetricInfo(
|
|
const std::string& metric_suffix) const;
|
|
|
|
private:
|
|
MetricInfo GetMetricInfoOrFail(const std::string& metric_suffix) const;
|
|
|
|
std::string metric_basename_;
|
|
std::string story_name_;
|
|
std::unordered_map<std::string, MetricInfo> metric_map_;
|
|
};
|
|
|
|
} // namespace test
|
|
} // namespace webrtc
|
|
|
|
#endif // TEST_TESTSUPPORT_PERF_RESULT_REPORTER_H_
|