ivoc 1973ba6ef4 Improve stability of the echo detector complexity perf tests.
The results of the echo detector complexity tests are currently notoriously spiky and unreliable. The following improvements are made in this CL:
- Significantly longer warmup time before starting the test
- More iterations and larger batches
- Different number of iterations for slow and fast tests
- Use the echo likelihood in the test so it cannot get optimized out

BUG=webrtc:7353

Review-Url: https://codereview.webrtc.org/2750413002
Cr-Commit-Position: refs/heads/master@{#17303}
2017-03-20 10:03:16 +00:00

76 lines
2.4 KiB
C++

/*
* Copyright (c) 2016 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.
*/
#include "webrtc/modules/audio_processing/test/performance_timer.h"
#include <math.h>
#include <numeric>
#include "webrtc/base/checks.h"
namespace webrtc {
namespace test {
PerformanceTimer::PerformanceTimer(int num_frames_to_process)
: clock_(webrtc::Clock::GetRealTimeClock()) {
timestamps_us_.reserve(num_frames_to_process);
}
PerformanceTimer::~PerformanceTimer() = default;
void PerformanceTimer::StartTimer() {
start_timestamp_us_ = rtc::Optional<int64_t>(clock_->TimeInMicroseconds());
}
void PerformanceTimer::StopTimer() {
RTC_DCHECK(start_timestamp_us_);
timestamps_us_.push_back(clock_->TimeInMicroseconds() - *start_timestamp_us_);
}
double PerformanceTimer::GetDurationAverage() const {
return GetDurationAverage(0);
}
double PerformanceTimer::GetDurationStandardDeviation() const {
return GetDurationStandardDeviation(0);
}
double PerformanceTimer::GetDurationAverage(
size_t number_of_warmup_samples) const {
RTC_DCHECK_GT(timestamps_us_.size(), number_of_warmup_samples);
const size_t number_of_samples =
timestamps_us_.size() - number_of_warmup_samples;
return static_cast<double>(
std::accumulate(timestamps_us_.begin() + number_of_warmup_samples,
timestamps_us_.end(), static_cast<int64_t>(0))) /
number_of_samples;
}
double PerformanceTimer::GetDurationStandardDeviation(
size_t number_of_warmup_samples) const {
RTC_DCHECK_GT(timestamps_us_.size(), number_of_warmup_samples);
const size_t number_of_samples =
timestamps_us_.size() - number_of_warmup_samples;
RTC_DCHECK_GT(number_of_samples, 0);
double average_duration = GetDurationAverage(number_of_warmup_samples);
double variance = std::accumulate(
timestamps_us_.begin() + number_of_warmup_samples, timestamps_us_.end(),
0.0, [average_duration](const double& a, const int64_t& b) {
return a + (b - average_duration) * (b - average_duration);
});
return sqrt(variance / number_of_samples);
}
} // namespace test
} // namespace webrtc