Chromium Code Reviews| Index: src/profile-generator.cc |
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
| index 8428303afe6da9daf82dddcb43aa0d827a8d4be6..4e2e38988a34a29b7f3331bd18532cf01c9bb131 100644 |
| --- a/src/profile-generator.cc |
| +++ b/src/profile-generator.cc |
| @@ -372,19 +372,30 @@ 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()), |
|
loislo
2013/07/29 18:01:27
Can we do that on the first sample?
yurys
2013/07/29 18:13:21
Doing it here should be more fair. With the sampli
|
| + 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::CalculateTotalTicks() { |
| +void CpuProfile::CalculateTotalTicksAndSamplingRate() { |
| + end_time_ms_ = OS::TimeCurrentMillis(); |
| top_down_.CalculateTotalTicks(); |
| -} |
| - |
| -void CpuProfile::SetActualSamplingRate(double actual_sampling_rate) { |
| - top_down_.SetTickRatePerMs(actual_sampling_rate); |
| + 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); |
| } |
| @@ -529,8 +540,7 @@ bool CpuProfilesCollection::StartProfiling(const char* title, unsigned uid, |
| } |
| -CpuProfile* CpuProfilesCollection::StopProfiling(const char* title, |
| - double actual_sampling_rate) { |
| +CpuProfile* CpuProfilesCollection::StopProfiling(const char* title) { |
| const int title_len = StrLength(title); |
| CpuProfile* profile = NULL; |
| current_profiles_semaphore_->Wait(); |
| @@ -543,8 +553,7 @@ CpuProfile* CpuProfilesCollection::StopProfiling(const char* title, |
| current_profiles_semaphore_->Signal(); |
| if (profile == NULL) return NULL; |
| - profile->CalculateTotalTicks(); |
| - profile->SetActualSamplingRate(actual_sampling_rate); |
| + profile->CalculateTotalTicksAndSamplingRate(); |
| finished_profiles_.Add(profile); |
| return profile; |
| } |
| @@ -601,29 +610,6 @@ 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 = |