Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 4e2e38988a34a29b7f3331bd18532cf01c9bb131..8428303afe6da9daf82dddcb43aa0d827a8d4be6 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -372,30 +372,19 @@ void ProfileTree::ShortPrint() { |
} |
-CpuProfile::CpuProfile(const char* title, unsigned uid, bool record_samples) |
- : title_(title), |
- uid_(uid), |
- record_samples_(record_samples), |
- start_time_ms_(OS::TimeCurrentMillis()), |
- end_time_ms_(0) { |
-} |
- |
- |
void CpuProfile::AddPath(const Vector<CodeEntry*>& path) { |
ProfileNode* top_frame_node = top_down_.AddPathFromEnd(path); |
if (record_samples_) samples_.Add(top_frame_node); |
} |
-void CpuProfile::CalculateTotalTicksAndSamplingRate() { |
- end_time_ms_ = OS::TimeCurrentMillis(); |
+void CpuProfile::CalculateTotalTicks() { |
top_down_.CalculateTotalTicks(); |
+} |
+ |
- double duration = end_time_ms_ - start_time_ms_; |
- if (duration < 1) duration = 1; |
- unsigned ticks = top_down_.root()->total_ticks(); |
- double rate = ticks / duration; |
- top_down_.SetTickRatePerMs(rate); |
+void CpuProfile::SetActualSamplingRate(double actual_sampling_rate) { |
+ top_down_.SetTickRatePerMs(actual_sampling_rate); |
} |
@@ -540,7 +529,8 @@ bool CpuProfilesCollection::StartProfiling(const char* title, unsigned uid, |
} |
-CpuProfile* CpuProfilesCollection::StopProfiling(const char* title) { |
+CpuProfile* CpuProfilesCollection::StopProfiling(const char* title, |
+ double actual_sampling_rate) { |
const int title_len = StrLength(title); |
CpuProfile* profile = NULL; |
current_profiles_semaphore_->Wait(); |
@@ -553,7 +543,8 @@ CpuProfile* CpuProfilesCollection::StopProfiling(const char* title) { |
current_profiles_semaphore_->Signal(); |
if (profile == NULL) return NULL; |
- profile->CalculateTotalTicksAndSamplingRate(); |
+ profile->CalculateTotalTicks(); |
+ profile->SetActualSamplingRate(actual_sampling_rate); |
finished_profiles_.Add(profile); |
return profile; |
} |
@@ -610,6 +601,29 @@ CodeEntry* CpuProfilesCollection::NewCodeEntry( |
} |
+void SampleRateCalculator::Tick() { |
+ if (--wall_time_query_countdown_ == 0) |
+ UpdateMeasurements(OS::TimeCurrentMillis()); |
+} |
+ |
+ |
+void SampleRateCalculator::UpdateMeasurements(double current_time) { |
+ if (measurements_count_++ != 0) { |
+ const double measured_ticks_per_ms = |
+ (kWallTimeQueryIntervalMs * ticks_per_ms_) / |
+ (current_time - last_wall_time_); |
+ // Update the average value. |
+ ticks_per_ms_ += |
+ (measured_ticks_per_ms - ticks_per_ms_) / measurements_count_; |
+ // Update the externally accessible result. |
+ result_ = static_cast<AtomicWord>(ticks_per_ms_ * kResultScale); |
+ } |
+ last_wall_time_ = current_time; |
+ wall_time_query_countdown_ = |
+ static_cast<unsigned>(kWallTimeQueryIntervalMs * ticks_per_ms_); |
+} |
+ |
+ |
const char* const ProfileGenerator::kAnonymousFunctionName = |
"(anonymous function)"; |
const char* const ProfileGenerator::kProgramEntryName = |