|  | // Copyright 2018 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "ui/latency/frame_metrics_test_common.h" | 
|  |  | 
|  | #include "base/logging.h" | 
|  |  | 
|  | namespace ui { | 
|  | namespace frame_metrics { | 
|  |  | 
|  | double TestStreamAnalyzerClient::TransformResult(double result) const { | 
|  | return result * result_scale; | 
|  | } | 
|  |  | 
|  | template <> | 
|  | void AddSamplesHelper(StreamAnalyzer* analyzer, | 
|  | uint64_t value, | 
|  | uint64_t weight, | 
|  | size_t iterations) { | 
|  | DCHECK_LE(value, std::numeric_limits<uint32_t>::max()); | 
|  | DCHECK_LE(weight, std::numeric_limits<uint32_t>::max()); | 
|  | for (size_t i = 0; i < iterations; i++) { | 
|  | analyzer->AddSample(value, weight); | 
|  | } | 
|  | } | 
|  |  | 
|  | TestRatioBoundaries::TestRatioBoundaries() { | 
|  | const uint32_t one = kFixedPointMultiplier; | 
|  | const uint32_t half = one / 2; | 
|  | // [0, 2^-16) => 1 bucket. | 
|  | int i = 0; | 
|  | boundaries[i++] = 0; | 
|  | // [2^-16,1) pow of 2 strides => 16 buckets. (16x1) | 
|  | for (int j = 0; j < 16; j++) | 
|  | boundaries[i++] = 1ULL << j; | 
|  | // [1,16) stride 1/2 => 30 buckets. (2 + 4 + 8 + 16) | 
|  | for (int j = 0; j < 30; j++) | 
|  | boundaries[i++] = one + (j * half); | 
|  | // [16,32) stride 1 => 16 buckets. | 
|  | for (int j = 0; j < 16; j++) | 
|  | boundaries[i++] = (16 + j) * one; | 
|  | // [32,64) stride 2 => 16 buckets. | 
|  | for (int j = 0; j < 16; j++) | 
|  | boundaries[i++] = (32 + 2 * j) * one; | 
|  | // [64,128) stride 8 => 8 buckets. | 
|  | for (int j = 0; j < 8; j++) | 
|  | boundaries[i++] = (64 + 8 * j) * one; | 
|  | // [128, 256) stride 16 => 8 buckets. | 
|  | for (int j = 0; j < 8; j++) | 
|  | boundaries[i++] = (128 + 16 * j) * one; | 
|  | // [256, 512) stride 64 => 4 buckets. | 
|  | for (int j = 0; j < 4; j++) | 
|  | boundaries[i++] = (256 + 64 * j) * one; | 
|  | // [512, 1024) stride 128 => 4 buckets. | 
|  | for (int j = 0; j < 4; j++) | 
|  | boundaries[i++] = (512 + 128 * j) * one; | 
|  | // [1024, 2048) stride 512 => 2 buckets. | 
|  | for (int j = 0; j < 2; j++) | 
|  | boundaries[i++] = (1024 + 512 * j) * one; | 
|  | // [2048, 4096) stride 1024 => 2 buckets. | 
|  | for (int j = 0; j < 2; j++) | 
|  | boundaries[i++] = (2048 + 1024 * j) * one; | 
|  | // [4096, 2^16) pow of 2 strides => 4 buckets. (4x1) | 
|  | for (int j = 0; j < 4; j++) | 
|  | boundaries[i++] = (4096ULL << j) * one; | 
|  | boundaries[i++] = 1ULL << 32; | 
|  | DCHECK_EQ(112, i); | 
|  | } | 
|  |  | 
|  | TestHistogram::TestHistogram() = default; | 
|  | TestHistogram::~TestHistogram() = default; | 
|  |  | 
|  | void TestHistogram::AddSample(uint32_t value, uint32_t weight) { | 
|  | added_samples_.push_back({value, weight}); | 
|  | } | 
|  |  | 
|  | PercentileResults TestHistogram::ComputePercentiles() const { | 
|  | return results_; | 
|  | } | 
|  |  | 
|  | std::vector<TestHistogram::ValueWeightPair> | 
|  | TestHistogram::GetAndResetAllAddedSamples() { | 
|  | return std::move(added_samples_); | 
|  | } | 
|  |  | 
|  | void TestHistogram::SetResults(PercentileResults results) { | 
|  | results_ = results; | 
|  | } | 
|  |  | 
|  | }  // namespace frame_metrics | 
|  | }  // namespace ui |