Migrate CallSimulator to the new perf metrics logging API

Bug: b/246095034
Change-Id: I613f702d2f469b6bc8d1634f8dda40d444ff7cf2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276632
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38213}
diff --git a/api/numerics/samples_stats_counter.cc b/api/numerics/samples_stats_counter.cc
index 36871a6..4eb0cde 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 5e22041..9d72296 100644
--- a/api/numerics/samples_stats_counter.h
+++ b/api/numerics/samples_stats_counter.h
@@ -34,6 +34,7 @@
   };
 
   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 ba9d01c..4b64d02 100644
--- a/modules/audio_processing/BUILD.gn
+++ b/modules/audio_processing/BUILD.gn
@@ -498,13 +498,15 @@
       ":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 8007826..10d3d84 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 @@
         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 @@
     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 @@
   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<double>(tmp * tmp);
-    }
-    const int denominator = rtc::checked_cast<int>(api_call_durations_.size()) -
-                            kNumInitializationFrames;
-    return (denominator > 0
-                ? rtc::checked_cast<int64_t>(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<int>(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 @@
   AudioFrameData frame_data_;
   webrtc::Clock* clock_;
   const size_t num_durations_to_store_;
-  std::vector<double> 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_;