/* * 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_