From c95aecb9359461b61dbc66bcca1564ce42ae51a2 Mon Sep 17 00:00:00 2001 From: "mikhail.naganov@gmail.com" Date: Fri, 24 Feb 2012 12:52:35 +0000 Subject: [PATCH] Tune snapshot taking progress indicator. As of dominators and retained sizes calculation take quite small time now comparing to the main passes, it is worth to exclude these from progress indicator. Now the indicator smoothly runs to 100%, while previously it ran to 50% and then instantly jumped to 100%. BUG=none TEST=none Review URL: https://chromiumcodereview.appspot.com/9463008 Patch from Alexei Filippov . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10823 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/profile-generator.cc | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/profile-generator.cc b/src/profile-generator.cc index b936e79a5c..156fbc7b63 100644 --- a/src/profile-generator.cc +++ b/src/profile-generator.cc @@ -3166,7 +3166,7 @@ bool HeapSnapshotGenerator::GenerateSnapshot() { debug_heap->Verify(); #endif - SetProgressTotal(4); // 2 passes + dominators + sizes. + SetProgressTotal(2); // 2 passes. #ifdef DEBUG debug_heap->Verify(); @@ -3303,10 +3303,9 @@ bool HeapSnapshotGenerator::BuildDominatorTree( affected[children[i].to()->ordered_index()] = true; } - int changed = 1; - const int base_progress_counter = progress_counter_; - while (changed != 0) { - changed = 0; + bool changed = true; + while (changed) { + changed = false; for (int i = root_index - 1; i >= 0; --i) { // If dominator of the entry has already been set to root, // then it can't propagate any further. @@ -3330,17 +3329,13 @@ bool HeapSnapshotGenerator::BuildDominatorTree( if (new_idom_index != kNoDominator && dominators->at(i) != new_idom_index) { (*dominators)[i] = new_idom_index; - ++changed; + changed = true; Vector children = entries[i]->children(); for (int j = 0; j < children.length(); ++j) { affected[children[j].to()->ordered_index()] = true; } } } - int remaining = entries_length - changed; - ASSERT(remaining >= 0); - progress_counter_ = base_progress_counter + remaining; - if (!ProgressReport(true)) return false; } return true; } @@ -3364,21 +3359,19 @@ bool HeapSnapshotGenerator::ApproximateRetainedSizes() { // As for the dominators tree we only know parent nodes, not // children, to sum up total sizes we "bubble" node's self size // adding it to all of its parents. - for (int i = 0; i < snapshot_->entries()->length(); ++i) { - HeapEntry* entry = snapshot_->entries()->at(i); + List& entries = *snapshot_->entries(); + for (int i = 0; i < entries.length(); ++i) { + HeapEntry* entry = entries[i]; entry->set_retained_size(entry->self_size()); } - for (int i = 0; - i < snapshot_->entries()->length(); - ++i, ProgressStep()) { - HeapEntry* entry = snapshot_->entries()->at(i); + for (int i = 0; i < entries.length(); ++i) { + HeapEntry* entry = entries[i]; int entry_size = entry->self_size(); for (HeapEntry* dominator = entry->dominator(); dominator != entry; entry = dominator, dominator = entry->dominator()) { dominator->add_retained_size(entry_size); } - if (!ProgressReport()) return false; } return true; }