123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /*
- * 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_
|