159 lines
5 KiB
C++
159 lines
5 KiB
C++
/*
|
|
* Copyright (C) 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ART_RUNTIME_PROFILER_OPTIONS_H_
|
|
#define ART_RUNTIME_PROFILER_OPTIONS_H_
|
|
|
|
#include <string>
|
|
#include <ostream>
|
|
|
|
namespace art {
|
|
|
|
enum ProfileDataType {
|
|
kProfilerMethod, // Method only
|
|
kProfilerBoundedStack, // Methods with Dex PC on top of the stack
|
|
};
|
|
std::ostream& operator<<(std::ostream& os, const ProfileDataType& rhs);
|
|
|
|
class ProfilerOptions {
|
|
public:
|
|
static constexpr bool kDefaultEnabled = false;
|
|
static constexpr uint32_t kDefaultPeriodS = 10;
|
|
static constexpr uint32_t kDefaultDurationS = 20;
|
|
static constexpr uint32_t kDefaultIntervalUs = 500;
|
|
static constexpr double kDefaultBackoffCoefficient = 2.0;
|
|
static constexpr bool kDefaultStartImmediately = false;
|
|
static constexpr double kDefaultTopKThreshold = 90.0;
|
|
static constexpr double kDefaultChangeInTopKThreshold = 10.0;
|
|
static constexpr ProfileDataType kDefaultProfileData = kProfilerMethod;
|
|
static constexpr uint32_t kDefaultMaxStackDepth = 3;
|
|
|
|
ProfilerOptions() :
|
|
enabled_(kDefaultEnabled),
|
|
period_s_(kDefaultPeriodS),
|
|
duration_s_(kDefaultDurationS),
|
|
interval_us_(kDefaultIntervalUs),
|
|
backoff_coefficient_(kDefaultBackoffCoefficient),
|
|
start_immediately_(kDefaultStartImmediately),
|
|
top_k_threshold_(kDefaultTopKThreshold),
|
|
top_k_change_threshold_(kDefaultChangeInTopKThreshold),
|
|
profile_type_(kDefaultProfileData),
|
|
max_stack_depth_(kDefaultMaxStackDepth) {}
|
|
|
|
ProfilerOptions(bool enabled,
|
|
uint32_t period_s,
|
|
uint32_t duration_s,
|
|
uint32_t interval_us,
|
|
double backoff_coefficient,
|
|
bool start_immediately,
|
|
double top_k_threshold,
|
|
double top_k_change_threshold,
|
|
ProfileDataType profile_type,
|
|
uint32_t max_stack_depth):
|
|
enabled_(enabled),
|
|
period_s_(period_s),
|
|
duration_s_(duration_s),
|
|
interval_us_(interval_us),
|
|
backoff_coefficient_(backoff_coefficient),
|
|
start_immediately_(start_immediately),
|
|
top_k_threshold_(top_k_threshold),
|
|
top_k_change_threshold_(top_k_change_threshold),
|
|
profile_type_(profile_type),
|
|
max_stack_depth_(max_stack_depth) {}
|
|
|
|
bool IsEnabled() const {
|
|
return enabled_;
|
|
}
|
|
|
|
uint32_t GetPeriodS() const {
|
|
return period_s_;
|
|
}
|
|
|
|
uint32_t GetDurationS() const {
|
|
return duration_s_;
|
|
}
|
|
|
|
uint32_t GetIntervalUs() const {
|
|
return interval_us_;
|
|
}
|
|
|
|
double GetBackoffCoefficient() const {
|
|
return backoff_coefficient_;
|
|
}
|
|
|
|
bool GetStartImmediately() const {
|
|
return start_immediately_;
|
|
}
|
|
|
|
double GetTopKThreshold() const {
|
|
return top_k_threshold_;
|
|
}
|
|
|
|
double GetTopKChangeThreshold() const {
|
|
return top_k_change_threshold_;
|
|
}
|
|
|
|
ProfileDataType GetProfileType() const {
|
|
return profile_type_;
|
|
}
|
|
|
|
uint32_t GetMaxStackDepth() const {
|
|
return max_stack_depth_;
|
|
}
|
|
|
|
private:
|
|
friend std::ostream & operator<<(std::ostream &os, const ProfilerOptions& po) {
|
|
os << "enabled=" << po.enabled_
|
|
<< ", period_s=" << po.period_s_
|
|
<< ", duration_s=" << po.duration_s_
|
|
<< ", interval_us=" << po.interval_us_
|
|
<< ", backoff_coefficient=" << po.backoff_coefficient_
|
|
<< ", start_immediately=" << po.start_immediately_
|
|
<< ", top_k_threshold=" << po.top_k_threshold_
|
|
<< ", top_k_change_threshold=" << po.top_k_change_threshold_
|
|
<< ", profile_type=" << po.profile_type_
|
|
<< ", max_stack_depth=" << po.max_stack_depth_;
|
|
return os;
|
|
}
|
|
|
|
friend class ParsedOptions;
|
|
|
|
// Whether or not the applications should be profiled.
|
|
bool enabled_;
|
|
// Generate profile every n seconds.
|
|
uint32_t period_s_;
|
|
// Run profile for n seconds.
|
|
uint32_t duration_s_;
|
|
// Microseconds between samples.
|
|
uint32_t interval_us_;
|
|
// Coefficient to exponential backoff.
|
|
double backoff_coefficient_;
|
|
// Whether the profile should start upon app startup or be delayed by some random offset.
|
|
bool start_immediately_;
|
|
// Top K% of samples that are considered relevant when deciding if the app should be recompiled.
|
|
double top_k_threshold_;
|
|
// How much the top K% samples needs to change in order for the app to be recompiled.
|
|
double top_k_change_threshold_;
|
|
// The type of profile data dumped to the disk.
|
|
ProfileDataType profile_type_;
|
|
// The max depth of the stack collected by the profiler
|
|
uint32_t max_stack_depth_;
|
|
};
|
|
|
|
} // namespace art
|
|
|
|
|
|
#endif // ART_RUNTIME_PROFILER_OPTIONS_H_
|