From 7fee2f79083edc6bbc2f57c26cdefc856639909c Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Mon, 26 Sep 2022 16:29:48 +0200 Subject: [PATCH] Migrate CallSimulator to the new perf metrics logging API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: b/246095034 Change-Id: I613f702d2f469b6bc8d1634f8dda40d444ff7cf2 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276632 Reviewed-by: Mirko Bonadei Reviewed-by: Per Ã…hgren Reviewed-by: Harald Alvestrand Commit-Queue: Artem Titov Cr-Commit-Position: refs/heads/main@{#38213} --- api/numerics/samples_stats_counter.cc | 4 ++ api/numerics/samples_stats_counter.h | 1 + modules/audio_processing/BUILD.gn | 4 +- .../audio_processing_performance_unittest.cc | 63 ++++++------------- 4 files changed, 27 insertions(+), 45 deletions(-) diff --git a/api/numerics/samples_stats_counter.cc b/api/numerics/samples_stats_counter.cc index 36871a6713..4eb0cde299 100644 --- a/api/numerics/samples_stats_counter.cc +++ b/api/numerics/samples_stats_counter.cc @@ -19,6 +19,10 @@ namespace webrtc { SamplesStatsCounter::SamplesStatsCounter() = default; +SamplesStatsCounter::SamplesStatsCounter(size_t expected_samples_count) { + samples_.reserve(expected_samples_count); +} + SamplesStatsCounter::~SamplesStatsCounter() = default; SamplesStatsCounter::SamplesStatsCounter(const SamplesStatsCounter&) = default; SamplesStatsCounter& SamplesStatsCounter::operator=( diff --git a/api/numerics/samples_stats_counter.h b/api/numerics/samples_stats_counter.h index 5e2204196a..9d72296317 100644 --- a/api/numerics/samples_stats_counter.h +++ b/api/numerics/samples_stats_counter.h @@ -34,6 +34,7 @@ class SamplesStatsCounter { }; SamplesStatsCounter(); + explicit SamplesStatsCounter(size_t expected_samples_count); ~SamplesStatsCounter(); SamplesStatsCounter(const SamplesStatsCounter&); SamplesStatsCounter& operator=(const SamplesStatsCounter&); diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn index ba9d01c027..4b64d0213d 100644 --- a/modules/audio_processing/BUILD.gn +++ b/modules/audio_processing/BUILD.gn @@ -498,13 +498,15 @@ if (rtc_include_tests) { ":audio_processing", ":audioproc_test_utils", "../../api:array_view", + "../../api/numerics", + "../../api/test/metrics:global_metrics_logger_and_exporter", + "../../api/test/metrics:metric", "../../rtc_base:platform_thread", "../../rtc_base:protobuf_utils", "../../rtc_base:random", "../../rtc_base:rtc_event", "../../rtc_base:safe_conversions", "../../system_wrappers", - "../../test:perf_test", "../../test:test_support", ] absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] diff --git a/modules/audio_processing/audio_processing_performance_unittest.cc b/modules/audio_processing/audio_processing_performance_unittest.cc index 8007826b6b..10d3d84951 100644 --- a/modules/audio_processing/audio_processing_performance_unittest.cc +++ b/modules/audio_processing/audio_processing_performance_unittest.cc @@ -16,6 +16,9 @@ #include "absl/strings/string_view.h" #include "api/array_view.h" +#include "api/numerics/samples_stats_counter.h" +#include "api/test/metrics/global_metrics_logger_and_exporter.h" +#include "api/test/metrics/metric.h" #include "modules/audio_processing/audio_processing_impl.h" #include "modules/audio_processing/test/audio_processing_builder_for_testing.h" #include "modules/audio_processing/test/test_utils.h" @@ -25,13 +28,14 @@ #include "rtc_base/random.h" #include "system_wrappers/include/clock.h" #include "test/gtest.h" -#include "test/testsupport/perf_test.h" namespace webrtc { - namespace { -static const bool kPrintAllDurations = false; +using ::webrtc::test::GetGlobalMetricsLogger; +using ::webrtc::test::ImprovementDirection; +using ::webrtc::test::Metric; +using ::webrtc::test::Unit; class CallSimulator; @@ -203,11 +207,11 @@ class TimedThreadApiProcessor { frame_data_(kMaxFrameSize), clock_(webrtc::Clock::GetRealTimeClock()), num_durations_to_store_(num_durations_to_store), + api_call_durations_(num_durations_to_store_ - kNumInitializationFrames), + samples_count_(0), input_level_(input_level), processor_type_(processor_type), - num_channels_(num_channels) { - api_call_durations_.reserve(num_durations_to_store_); - } + num_channels_(num_channels) {} // Implements the callback functionality for the threads. bool Process(); @@ -219,21 +223,17 @@ class TimedThreadApiProcessor { const std::string sample_rate_name = "_" + std::to_string(simulation_config_->sample_rate_hz) + "Hz"; - webrtc::test::PrintResultMeanAndError( - "apm_timing", sample_rate_name, processor_name, GetDurationAverage(), - GetDurationStandardDeviation(), "us", false); - - if (kPrintAllDurations) { - webrtc::test::PrintResultList("apm_call_durations", sample_rate_name, - processor_name, api_call_durations_, "us", - false); - } + GetGlobalMetricsLogger()->LogMetric( + "apm_timing" + sample_rate_name, processor_name, api_call_durations_, + Unit::kMilliseconds, ImprovementDirection::kNeitherIsBetter); } void AddDuration(int64_t duration) { - if (api_call_durations_.size() < num_durations_to_store_) { - api_call_durations_.push_back(duration); + if (samples_count_ >= kNumInitializationFrames && + samples_count_ < num_durations_to_store_) { + api_call_durations_.AddSample(duration); } + samples_count_++; } private: @@ -241,32 +241,6 @@ class TimedThreadApiProcessor { static const int kMaxFrameSize = 480; static const int kNumInitializationFrames = 5; - int64_t GetDurationStandardDeviation() const { - double variance = 0; - const int64_t average_duration = GetDurationAverage(); - for (size_t k = kNumInitializationFrames; k < api_call_durations_.size(); - k++) { - int64_t tmp = api_call_durations_[k] - average_duration; - variance += static_cast(tmp * tmp); - } - const int denominator = rtc::checked_cast(api_call_durations_.size()) - - kNumInitializationFrames; - return (denominator > 0 - ? rtc::checked_cast(sqrt(variance / denominator)) - : -1); - } - - int64_t GetDurationAverage() const { - int64_t average_duration = 0; - for (size_t k = kNumInitializationFrames; k < api_call_durations_.size(); - k++) { - average_duration += api_call_durations_[k]; - } - const int denominator = rtc::checked_cast(api_call_durations_.size()) - - kNumInitializationFrames; - return (denominator > 0 ? average_duration / denominator : -1); - } - int ProcessCapture() { // Set the stream delay. apm_->set_stream_delay_ms(30); @@ -382,7 +356,8 @@ class TimedThreadApiProcessor { AudioFrameData frame_data_; webrtc::Clock* clock_; const size_t num_durations_to_store_; - std::vector api_call_durations_; + SamplesStatsCounter api_call_durations_; + size_t samples_count_ = 0; const float input_level_; bool first_process_call_ = true; const ProcessorType processor_type_;