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 <alexeif@chromium.org>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10823 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
mikhail.naganov@gmail.com 2012-02-24 12:52:35 +00:00
parent 9f83b4ee36
commit c95aecb935

View File

@ -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<HeapGraphEdge> 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<HeapEntry*>& 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;
}