blob: 7e3fc68ee3b4632ebff32e55cd9221af52cfe1da [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/platform/scheduler/common/ukm_task_sampler.h"
#include "third_party/blink/renderer/platform/wtf/math_extras.h"
namespace blink {
namespace scheduler {
UkmTaskSampler::UkmTaskSampler(double thread_time_sampling_rate,
double ukm_task_sampling_rate)
: thread_time_sampling_rate_(clampTo(thread_time_sampling_rate, 0.0, 1.0)),
ukm_task_sampling_rate_(clampTo(ukm_task_sampling_rate, 0.0, 1.0)) {}
double UkmTaskSampler::GetConditionalSamplingProbability(bool has_thread_time) {
if (thread_time_sampling_rate_ == 0.0 || ukm_task_sampling_rate_ == 0.0 ||
!(ukm_task_sampling_rate_ < 1.0)) {
return ukm_task_sampling_rate_;
}
if (thread_time_sampling_rate_ < ukm_task_sampling_rate_) {
if (has_thread_time) {
return 1.0;
} else {
// Note thread_time_sampling_rate_ < 1 given that
// thread_time_sampling_rate_ < ukm_task_sampling_rate_ < 1
return (ukm_task_sampling_rate_ - thread_time_sampling_rate_) /
(1.0 - thread_time_sampling_rate_);
}
} else {
if (has_thread_time) {
// Also covers the case when ukm_task_sampling_rate_ ==
// thread_time_sampling_rate_
return ukm_task_sampling_rate_ / thread_time_sampling_rate_;
} else {
return 0.0;
}
}
}
bool UkmTaskSampler::ShouldRecordTaskUkm(bool has_thread_time) {
double probability = GetConditionalSamplingProbability(has_thread_time);
std::bernoulli_distribution dist(probability);
return dist(random_generator_);
}
void UkmTaskSampler::SetUkmTaskSamplingRate(double rate) {
ukm_task_sampling_rate_ = clampTo(rate, 0.0, 1.0);
}
} // namespace scheduler
} // namespace blink