1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
/*
* Copyright (C) 2016 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
* * See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ART_RUNTIME_JIT_PROFILE_SAVER_OPTIONS_H_
#define ART_RUNTIME_JIT_PROFILE_SAVER_OPTIONS_H_
#include <ostream>
#include <string>
namespace art {
struct ProfileSaverOptions {
public:
static constexpr uint32_t kMinSavePeriodMs = 40 * 1000; // 40 seconds
static constexpr uint32_t kSaveResolvedClassesDelayMs = 5 * 1000; // 5 seconds
// Minimum number of JIT samples during launch to mark a method as hot in the profile.
static constexpr uint32_t kHotStartupMethodSamples = 1;
static constexpr uint32_t kHotStartupMethodSamplesLowRam = 256;
static constexpr uint32_t kMinMethodsToSave = 10;
static constexpr uint32_t kMinClassesToSave = 10;
static constexpr uint32_t kMinNotificationBeforeWake = 10;
static constexpr uint32_t kMaxNotificationBeforeWake = 50;
static constexpr uint32_t kHotStartupMethodSamplesNotSet = std::numeric_limits<uint32_t>::max();
ProfileSaverOptions() :
enabled_(false),
min_save_period_ms_(kMinSavePeriodMs),
save_resolved_classes_delay_ms_(kSaveResolvedClassesDelayMs),
hot_startup_method_samples_(kHotStartupMethodSamplesNotSet),
min_methods_to_save_(kMinMethodsToSave),
min_classes_to_save_(kMinClassesToSave),
min_notification_before_wake_(kMinNotificationBeforeWake),
max_notification_before_wake_(kMaxNotificationBeforeWake),
profile_path_(""),
profile_boot_class_path_(false),
profile_aot_code_(false),
wait_for_jit_notifications_to_save_(true) {}
ProfileSaverOptions(
bool enabled,
uint32_t min_save_period_ms,
uint32_t save_resolved_classes_delay_ms,
uint32_t hot_startup_method_samples,
uint32_t min_methods_to_save,
uint32_t min_classes_to_save,
uint32_t min_notification_before_wake,
uint32_t max_notification_before_wake,
const std::string& profile_path,
bool profile_boot_class_path,
bool profile_aot_code = false,
bool wait_for_jit_notifications_to_save = true)
: enabled_(enabled),
min_save_period_ms_(min_save_period_ms),
save_resolved_classes_delay_ms_(save_resolved_classes_delay_ms),
hot_startup_method_samples_(hot_startup_method_samples),
min_methods_to_save_(min_methods_to_save),
min_classes_to_save_(min_classes_to_save),
min_notification_before_wake_(min_notification_before_wake),
max_notification_before_wake_(max_notification_before_wake),
profile_path_(profile_path),
profile_boot_class_path_(profile_boot_class_path),
profile_aot_code_(profile_aot_code),
wait_for_jit_notifications_to_save_(wait_for_jit_notifications_to_save) {}
bool IsEnabled() const {
return enabled_;
}
void SetEnabled(bool enabled) {
enabled_ = enabled;
}
uint32_t GetMinSavePeriodMs() const {
return min_save_period_ms_;
}
uint32_t GetSaveResolvedClassesDelayMs() const {
return save_resolved_classes_delay_ms_;
}
uint32_t GetHotStartupMethodSamples(bool is_low_ram) const {
uint32_t ret = hot_startup_method_samples_;
if (ret == kHotStartupMethodSamplesNotSet) {
ret = is_low_ram ? kHotStartupMethodSamplesLowRam : kHotStartupMethodSamples;
}
return ret;
}
uint32_t GetMinMethodsToSave() const {
return min_methods_to_save_;
}
uint32_t GetMinClassesToSave() const {
return min_classes_to_save_;
}
uint32_t GetMinNotificationBeforeWake() const {
return min_notification_before_wake_;
}
uint32_t GetMaxNotificationBeforeWake() const {
return max_notification_before_wake_;
}
std::string GetProfilePath() const {
return profile_path_;
}
bool GetProfileBootClassPath() const {
return profile_boot_class_path_;
}
bool GetProfileAOTCode() const {
return profile_aot_code_;
}
bool GetWaitForJitNotificationsToSave() const {
return wait_for_jit_notifications_to_save_;
}
void SetWaitForJitNotificationsToSave(bool value) {
wait_for_jit_notifications_to_save_ = value;
}
friend std::ostream & operator<<(std::ostream &os, const ProfileSaverOptions& pso) {
os << "enabled_" << pso.enabled_
<< ", min_save_period_ms_" << pso.min_save_period_ms_
<< ", save_resolved_classes_delay_ms_" << pso.save_resolved_classes_delay_ms_
<< ", hot_startup_method_samples_" << pso.hot_startup_method_samples_
<< ", min_methods_to_save_" << pso.min_methods_to_save_
<< ", min_classes_to_save_" << pso.min_classes_to_save_
<< ", min_notification_before_wake_" << pso.min_notification_before_wake_
<< ", max_notification_before_wake_" << pso.max_notification_before_wake_
<< ", profile_boot_class_path_" << pso.profile_boot_class_path_
<< ", profile_aot_code_" << pso.profile_aot_code_
<< ", wait_for_jit_notifications_to_save_" << pso.wait_for_jit_notifications_to_save_;
return os;
}
bool enabled_;
uint32_t min_save_period_ms_;
uint32_t save_resolved_classes_delay_ms_;
// Do not access hot_startup_method_samples_ directly for reading since it may be set to the
// placeholder default.
uint32_t hot_startup_method_samples_;
uint32_t min_methods_to_save_;
uint32_t min_classes_to_save_;
uint32_t min_notification_before_wake_;
uint32_t max_notification_before_wake_;
std::string profile_path_;
bool profile_boot_class_path_;
bool profile_aot_code_;
bool wait_for_jit_notifications_to_save_;
};
} // namespace art
#endif // ART_RUNTIME_JIT_PROFILE_SAVER_OPTIONS_H_
|