1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ART_RUNTIME_PROFILER_OPTIONS_H_ 18 #define ART_RUNTIME_PROFILER_OPTIONS_H_ 19 20 #include <string> 21 #include <ostream> 22 23 namespace art { 24 25 enum ProfileDataType { 26 kProfilerMethod, // Method only 27 kProfilerBoundedStack, // Methods with Dex PC on top of the stack 28 }; 29 std::ostream& operator<<(std::ostream& os, const ProfileDataType& rhs); 30 31 class ProfilerOptions { 32 public: 33 static constexpr bool kDefaultEnabled = false; 34 static constexpr uint32_t kDefaultPeriodS = 10; 35 static constexpr uint32_t kDefaultDurationS = 20; 36 static constexpr uint32_t kDefaultIntervalUs = 500; 37 static constexpr double kDefaultBackoffCoefficient = 2.0; 38 static constexpr bool kDefaultStartImmediately = false; 39 static constexpr double kDefaultTopKThreshold = 90.0; 40 static constexpr double kDefaultChangeInTopKThreshold = 10.0; 41 static constexpr ProfileDataType kDefaultProfileData = kProfilerMethod; 42 static constexpr uint32_t kDefaultMaxStackDepth = 3; 43 ProfilerOptions()44 ProfilerOptions() : 45 enabled_(kDefaultEnabled), 46 period_s_(kDefaultPeriodS), 47 duration_s_(kDefaultDurationS), 48 interval_us_(kDefaultIntervalUs), 49 backoff_coefficient_(kDefaultBackoffCoefficient), 50 start_immediately_(kDefaultStartImmediately), 51 top_k_threshold_(kDefaultTopKThreshold), 52 top_k_change_threshold_(kDefaultChangeInTopKThreshold), 53 profile_type_(kDefaultProfileData), 54 max_stack_depth_(kDefaultMaxStackDepth) {} 55 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)56 ProfilerOptions(bool enabled, 57 uint32_t period_s, 58 uint32_t duration_s, 59 uint32_t interval_us, 60 double backoff_coefficient, 61 bool start_immediately, 62 double top_k_threshold, 63 double top_k_change_threshold, 64 ProfileDataType profile_type, 65 uint32_t max_stack_depth): 66 enabled_(enabled), 67 period_s_(period_s), 68 duration_s_(duration_s), 69 interval_us_(interval_us), 70 backoff_coefficient_(backoff_coefficient), 71 start_immediately_(start_immediately), 72 top_k_threshold_(top_k_threshold), 73 top_k_change_threshold_(top_k_change_threshold), 74 profile_type_(profile_type), 75 max_stack_depth_(max_stack_depth) {} 76 IsEnabled()77 bool IsEnabled() const { 78 return enabled_; 79 } 80 GetPeriodS()81 uint32_t GetPeriodS() const { 82 return period_s_; 83 } 84 GetDurationS()85 uint32_t GetDurationS() const { 86 return duration_s_; 87 } 88 GetIntervalUs()89 uint32_t GetIntervalUs() const { 90 return interval_us_; 91 } 92 GetBackoffCoefficient()93 double GetBackoffCoefficient() const { 94 return backoff_coefficient_; 95 } 96 GetStartImmediately()97 bool GetStartImmediately() const { 98 return start_immediately_; 99 } 100 GetTopKThreshold()101 double GetTopKThreshold() const { 102 return top_k_threshold_; 103 } 104 GetTopKChangeThreshold()105 double GetTopKChangeThreshold() const { 106 return top_k_change_threshold_; 107 } 108 GetProfileType()109 ProfileDataType GetProfileType() const { 110 return profile_type_; 111 } 112 GetMaxStackDepth()113 uint32_t GetMaxStackDepth() const { 114 return max_stack_depth_; 115 } 116 117 private: 118 friend std::ostream & operator<<(std::ostream &os, const ProfilerOptions& po) { 119 os << "enabled=" << po.enabled_ 120 << ", period_s=" << po.period_s_ 121 << ", duration_s=" << po.duration_s_ 122 << ", interval_us=" << po.interval_us_ 123 << ", backoff_coefficient=" << po.backoff_coefficient_ 124 << ", start_immediately=" << po.start_immediately_ 125 << ", top_k_threshold=" << po.top_k_threshold_ 126 << ", top_k_change_threshold=" << po.top_k_change_threshold_ 127 << ", profile_type=" << po.profile_type_ 128 << ", max_stack_depth=" << po.max_stack_depth_; 129 return os; 130 } 131 132 friend class ParsedOptions; 133 134 // Whether or not the applications should be profiled. 135 bool enabled_; 136 // Generate profile every n seconds. 137 uint32_t period_s_; 138 // Run profile for n seconds. 139 uint32_t duration_s_; 140 // Microseconds between samples. 141 uint32_t interval_us_; 142 // Coefficient to exponential backoff. 143 double backoff_coefficient_; 144 // Whether the profile should start upon app startup or be delayed by some random offset. 145 bool start_immediately_; 146 // Top K% of samples that are considered relevant when deciding if the app should be recompiled. 147 double top_k_threshold_; 148 // How much the top K% samples needs to change in order for the app to be recompiled. 149 double top_k_change_threshold_; 150 // The type of profile data dumped to the disk. 151 ProfileDataType profile_type_; 152 // The max depth of the stack collected by the profiler 153 uint32_t max_stack_depth_; 154 }; 155 156 } // namespace art 157 158 159 #endif // ART_RUNTIME_PROFILER_OPTIONS_H_ 160